Version 2.0.0-dev.61.0

Merge commit '5aa65c003721ff190dd34ae16a6959c38243fb1a' into dev
diff --git a/BUILD.gn b/BUILD.gn
index d0cd1b5..b3f49d3 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -51,7 +51,8 @@
 group("runtime_kernel") {
   import("runtime/runtime_args.gni")
 
-  target_supports_aot = dart_target_arch == "arm" || dart_target_arch == "arm64" || dart_target_arch == "x64"
+  target_supports_aot = dart_target_arch == "arm" ||
+                        dart_target_arch == "arm64" || dart_target_arch == "x64"
 
   if (targetting_fuchsia) {
     # Fuchsia has run_vm_tests marked testonly.
@@ -67,7 +68,7 @@
   ]
 
   if (target_supports_aot) {
-    deps += ["runtime/bin:precompiler_entry_points_json"]
+    deps += [ "runtime/bin:precompiler_entry_points_json" ]
   }
 }
 
@@ -139,9 +140,19 @@
   ]
 }
 
+# This rule and the compressed_observatory_archive rule are for the Fuchsia
+# bots that pre-build the Observatory. They copy the observatory tar files to
+# the root build output directory for convenient access by the Fuchsia buildbot
+# scripts.
 group("observatory_archive") {
   deps = [
-    "runtime/observatory:observatory_archive"
+    "runtime/observatory:copy_observatory_archive",
+  ]
+}
+
+group("compressed_observatory_archive") {
+  deps = [
+    "runtime/observatory:copy_compressed_observatory_archive",
   ]
 }
 
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 08bfa29..79549fe 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,26 @@
+## 2.0.0-dev.61.0
+
+### Dart VM
+
+* `async` functions now start synchronously by default.
+  Passing the `--no-sync-async` flag will produce the old behavior,
+  starting `async` functions asynchronously.
+
+### Tool Changes
+
+#### Pub
+
+* Fix support for running executables in Dart 2 mode.
+
+### Core library changes
+
+* `dart:io`
+  * Dart-styled constants have been added for `HttpStatus`, `HttpHeaders`,
+    `ContentType`, `HttpClient`, `WebSocketStatus`, `CompressionOptions`,
+    and `WebSocket`. The `SCREAMING_CAPS` constants are marked deprecated.
+    Note that `HttpStatus.CONTINUE` is now `HttpStatus.continue_`, and that
+    e.g. `HttpHeaders.FIELD_NAME` is now `HttpHeaders.fieldNameHeader`.
+
 ## 2.0.0-dev.60.0
 
 ### Core library changes
@@ -98,6 +121,14 @@
   * Added `FileSystemEntity.fromRawPath` constructor to allow for
     the creation of `FileSystemEntity` using `Uint8List` buffers.
 
+### Dart VM
+
+* `async` functions now start synchronously when previewing Dart 2 with
+  `--preview-dart-2`.  Build tools (e.g., build_runner) may override the
+  default and/or allow developers to configure.  Passing the
+  `--no-sync-async` flag will produce the old behavior, starting `async`
+  functions asynchronously.
+
 ### Tool Changes
 
 #### dartfmt
diff --git a/DEPS b/DEPS
index 76e7739..544ccdc 100644
--- a/DEPS
+++ b/DEPS
@@ -94,7 +94,7 @@
   "intl_tag": "0.15.2",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_tag": "2.0.6",
-  "linter_tag": "0.1.51",
+  "linter_tag": "0.1.52",
   "logging_tag": "0.11.3+1",
   "markdown_tag": "2.0.0",
   "matcher_tag": "0.12.1+4",
@@ -110,7 +110,7 @@
   "ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_tag": "1.3.4",
   "protobuf_tag": "0.7.1",
-  "pub_rev": "7bdcf4e4de85a7a8c7a322511b8198f1b6cb0a73",
+  "pub_rev": "d84173eeb03c328ed533469108ce81b11d736a80",
   "pub_semver_tag": "1.4.1",
   "quiver_tag": "5aaa3f58c48608af5b027444d561270b53f15dbf",
   "resource_rev":"af5a5bf65511943398146cf146e466e5f0b95cb9",
diff --git a/build/dart/dart_action.gni b/build/dart/dart_action.gni
index 6bd19d7..77a0130 100644
--- a/build/dart/dart_action.gni
+++ b/build/dart/dart_action.gni
@@ -52,6 +52,10 @@
       visibility = invoker.visibility
     }
 
+    if (defined(invoker.testonly)) {
+      testonly = invoker.testonly
+    }
+
     script = "$_dart_root/build/gn_run_binary.py"
 
     if (defined(invoker.inputs)) {
@@ -111,10 +115,11 @@
     not_needed(invoker, ["target"])
     action(target_name) {
       forward_variables_from(invoker, [
-          "outputs",
-          "deps",
-          "visibility",
           "depfile",
+          "deps",
+          "outputs",
+          "testonly",
+          "visibility",
       ])
       script = "$_dart_root/build/gn_run_binary.py"
 
@@ -148,11 +153,12 @@
     not_needed(invoker, ["binary"])
     _compiled_action(target_name) {
       forward_variables_from(invoker, [
+          "depfile",
+          "deps",
           "inputs",
           "outputs",
-          "deps",
+          "testonly",
           "visibility",
-          "depfile",
       ])
 
       if (defined(invoker.script)) {
@@ -200,6 +206,7 @@
 #    deps
 #    inputs
 #    outputs
+#    testonly
 #    visibility
 template("prebuilt_dart_action") {
   assert(defined(invoker.script), "script must be defined for $target_name")
@@ -253,6 +260,7 @@
 #    deps
 #    inputs
 #    outputs
+#    testonly
 #    visibility
 template("_built_tool_action") {
   assert(defined(invoker.tool), "tool must be defined for $target_name")
@@ -273,6 +281,7 @@
         "inputs",
         "outputs",
         "tool",
+        "testonly",
         "visibility",
     ])
 
@@ -317,6 +326,7 @@
 #    deps
 #    inputs
 #    outputs
+#    testonly
 #    visibility
 template("dart_action") {
   assert(defined(invoker.script), "script must be defined for $target_name")
@@ -331,6 +341,7 @@
         "outputs",
         "packages",
         "script",
+        "testonly",
         "tool",
         "visibility",
         "vm_args",
@@ -363,6 +374,7 @@
 #    deps
 #    inputs
 #    outputs
+#    testonly
 #    visibility
 template("dart_bootstrap_action") {
   assert(defined(invoker.script), "script must be defined for $target_name")
@@ -377,6 +389,7 @@
         "outputs",
         "packages",
         "script",
+        "testonly",
         "tool",
         "visibility",
         "vm_args",
@@ -408,6 +421,7 @@
 #    deps
 #    inputs
 #    outputs
+#    testonly
 #    visibility
 template("gen_snapshot_action") {
   assert(!defined(invoker.script),
@@ -422,6 +436,7 @@
         "inputs",
         "outputs",
         "packages",
+        "testonly",
         "tool",
         "visibility",
         "vm_args",
diff --git a/dartdoc_options.yaml b/dartdoc_options.yaml
index 4e73e84..6c233f4 100644
--- a/dartdoc_options.yaml
+++ b/dartdoc_options.yaml
@@ -1,2 +1,2 @@
 dartdoc:
-  categoryOrder: ["VM", "Web"]
+  categoryOrder: ["Core", VM", "Web"]
diff --git a/docs/language/dart.sty b/docs/language/dart.sty
index 468a8e8..6c8a3e5 100644
--- a/docs/language/dart.sty
+++ b/docs/language/dart.sty
@@ -95,6 +95,9 @@
   %\end{verbatim}
 }
 
+% A commonly used name for an identifier
+\newcommand{\id}{\metavar{id}}
+
 % ----------------------------------------------------------------------
 % Support for hash valued Location Markers
 
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index 2db8dfe..17d6731 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -47,11 +47,14 @@
 %   local function evaluates to the closurization of that declaration.
 % - Make `mixin` and `interface` built-in identifiers.
 % - Make `async` *not* a reserved word inside async functions.
-% - Added 'Class Member Conflicts', simplifying and adjusting rules about
+% - Add 'Class Member Conflicts', simplifying and adjusting rules about
 %   member declaration conflicts beyond "`n` declared twice in one scope".
 % - Specify that integer literals are limited to signed 64-bit values,
 %   and that the `int` class is intended as signed 64-bit integer, but
 %   that platforms may differ.
+% - Specify variance and super-bounded types.
+% - Introduce `subterm` and `immediate subterm`.
+% - Introduce `top type`.
 %
 % 1.15
 % - Change how language specification describes control flow.
@@ -230,12 +233,38 @@
 Productions are embedded, as much as possible, in the discussion of the constructs they represent.
 
 \LMHash{}
+A {\em term} is a syntactic construct.
+It may be considered to be a piece of text which is derivable in the grammar,
+and it may be considered to be a tree created by such a derivation.
+An {\em immediate subterm} of a given term $t$ is a syntactic construct
+which corresponds to an immediate subtree of $t$ considered as a derivation tree.
+A {\em subterm} of a given term $t$ is $t$,
+or an immediate subterm of $t$,
+or a subterm of an immediate subterm of $t$.
+
+\LMHash{}
 A list $x_1, \ldots, x_n$ denotes any list of $n$ elements of the form $x_i, 1 \le i \le n$.
 Note that $n$ may be zero, in which case the list is empty.
 We use such lists extensively throughout this specification.
 
 \LMHash{}
-The notation $[x_1/y_1, \ldots, x_n/y_n]E$ denotes a copy of $E$ in which all occurrences of $y_i, 1 \le i \le n$ have been replaced with $x_i$.
+For $j \in 1 .. n$,
+let $y_j$ be an atomic syntactic entity (like an identifier),
+$x_j$ a composite syntactic entity (like an expression or a type),
+and $E$ again a composite syntactic entity.
+The notation $[x_1/y_1, \ldots, x_n/y_n]E$ then denotes a copy of $E$
+in which each occurrence of $y_i, 1 \le i \le n$ has been replaced by $x_i$.
+
+\LMHash{}
+This operation is also known as substitution, and it is the variant that avoids capture.
+That is, when $E$ contains a construct that introduces $y_i$ into a nested scope for some $i \in 1 .. n$,
+the substitution will not replace $y_i$ in that scope.
+Conversely, if such a replacement would put an identifier \id{} (a subterm of $x_i$) into a scope where \id{} is declared,
+the relevant declarations in $E$ are systematically renamed to fresh names.
+
+\commentary{
+In short, capture freedom ensures that the ``meaning'' of each identifier is preserved during substitution.
+}
 
 \LMHash{}
 We sometimes abuse list or map literal syntax, writing $[o_1, \ldots, o_n]$ (respectively $\{k_1: o_1, \ldots, k_n: o_n\}$) where the $o_i$ and $k_i$ may be objects rather than expressions.
@@ -1611,7 +1640,7 @@
 Constructors may be generative (\ref{generativeConstructors}) or they may be factories (\ref{factories}).
 
 \LMHash{}
-A {\em constructor name} always begins with the name of its immediately enclosing class, and may optionally be followed by a dot and an identifier $id$.
+A {\em constructor name} always begins with the name of its immediately enclosing class, and may optionally be followed by a dot and an identifier \id.
 It is a compile-time error if the name of a constructor is not a constructor name.
 
 \commentary{
@@ -1641,14 +1670,14 @@
 \LMHash{}
 A {\em constructor parameter list} is a parenthesized, comma-separated list of formal constructor parameters.
 A {\em formal constructor parameter} is either a formal parameter (\ref{formalParameters}) or an initializing formal.
-An {\em initializing formal} has the form \code{\THIS{}.$id$}, where $id$ is the name of an instance variable of the immediately enclosing class.
-It is a compile-time error if $id$ is not an instance variable of the immediately enclosing class.
+An {\em initializing formal} has the form \code{\THIS{}.\id}, where \id{} is the name of an instance variable of the immediately enclosing class.
+It is a compile-time error if \id{} is not an instance variable of the immediately enclosing class.
 It is a compile-time error if an initializing formal is used by a function other than a non-redirecting generative constructor.
 
 \LMHash{}
 If an explicit type is attached to the initializing formal, that is its static type.
-Otherwise, the type of an initializing formal named $id$ is $T_{id}$, where $T_{id}$ is the type of the instance variable named $id$ in the immediately enclosing class.
-It is a static warning if the static type of $id$ is not a subtype of $T_{id}$.
+Otherwise, the type of an initializing formal named \id{} is $T_{id}$, where $T_{id}$ is the type of the instance variable named \id{} in the immediately enclosing class.
+It is a static warning if the static type of \id{} is not a subtype of $T_{id}$.
 
 \LMHash{}
 Initializing formals constitute an exception to the rule that every formal parameter introduces a local variable into the formal parameter scope (\ref{formalParameters}).
@@ -1663,8 +1692,8 @@
 
 \LMHash{}
 Initializing formals are executed during the execution of generative constructors detailed below.
-Executing an initializing formal \code{\THIS{}.$id$} causes the instance variable $id$ of the immediately surrounding class to be assigned the value of the corresponding actual parameter,
-unless $id$ is a final variable that has already been initialized, in which case a run-time error occurs.
+Executing an initializing formal \code{\THIS{}.\id} causes the instance variable \id{} of the immediately surrounding class to be assigned the value of the corresponding actual parameter,
+unless \id{} is a final variable that has already been initialized, in which case a run-time error occurs.
 
 \commentary{
 The above rule allows initializing formals to be used as optional parameters:
@@ -1861,7 +1890,7 @@
 \code{\SUPER{}($a_1, \ldots,\ a_n,\ x_{n+1}: a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 
 (respectively
-\code{\SUPER{}.id($a_1, \ldots,\ a_n,\ x_{n+1}: a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)})
+\code{\SUPER{}.\id($a_1, \ldots,\ a_n,\ x_{n+1}: a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)})
 
 proceeds as follows:
 
@@ -1879,13 +1908,13 @@
 If $S$ is generic (\ref{generics}), let $U_1, \ldots, U_m$ be the actual type arguments passed to $S$ in the superclass clause of $C$.
 
 \LMHash{}
-The generative constructor $S$ (respectively $S.id$) of $S$ is executed
+The generative constructor $S$ (respectively \code{$S$.\id}) of $S$ is executed
 to initialize $i$ with respect to the bindings that resulted from the evaluation of
 \code{($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
 and the type parameters (if any) of class $S$ bound to $U_1, \ldots, U_m$.
 
 \LMHash{}
-It is a compile-time error if class $S$ does not declare a generative constructor named $S$ (respectively $S.id$).
+It is a compile-time error if class $S$ does not declare a generative constructor named $S$ (respectively \code{$S$.\id}).
 
 
 \subsubsection{Factories}
@@ -1902,7 +1931,7 @@
 %The enclosing scope of a factory constructor is the static scope \ref{} of the class in which it is declared.
 
 \LMHash{}
-The {\em return type} of a factory whose signature is of the form \FACTORY{} $M$ or the form \FACTORY{} $M.id$ is $M$ if $M$ is not a generic type;
+The {\em return type} of a factory whose signature is of the form \FACTORY{} $M$ or the form \FACTORY{} \code{$M$.\id} is $M$ if $M$ is not a generic type;
 otherwise the return type is \code{$M$<$T_1, \ldots,\ T_n$>} where $T_1, \ldots, T_n$ are the type parameters of the enclosing class.
 
 \LMHash{}
@@ -1940,7 +1969,7 @@
 The resulting constructor call is governed by the same rules as an instance creation expression using \NEW{} (\ref{instanceCreation}).
 
 \commentary{
-It follows that if $type$ or $type.id$ are not defined, or do not refer to a class or constructor, a dynamic error occurs, as with any other undefined constructor call.
+It follows that if \metavar{type} or \code{\metavar{type}.\id} are not defined, or do not refer to a class or constructor, a dynamic error occurs, as with any other undefined constructor call.
 The same holds if $k$ is called with fewer required parameters or more positional parameters than $k'$ expects, or if $k$ is called with a named parameter that is not declared by $k'$.
 }
 
@@ -1962,7 +1991,7 @@
 }
 
 \LMHash{}
-It is a static warning if $type$ does not denote a class accessible in the current scope; if $type$ does denote such a class $C$ it is a static warning if the referenced constructor (be it $type$ or $type.id$) is not a constructor of $C$.
+It is a static warning if $type$ does not denote a class accessible in the current scope; if $type$ does denote such a class $C$ it is a static warning if the referenced constructor (be it \metavar{type} or \code{\metavar{type}.\id}) is not a constructor of $C$.
 
 \commentary{
 Note that it is not possible to modify the arguments being passed to $k'$.
@@ -2803,16 +2832,16 @@
 A {\em generic class} is a mapping that accepts a list of actual type arguments and maps them to a class.
 Consider a generic class declaration $G$ named \code{C} with formal type parameter declarations
 $X_1\ \EXTENDS\ B_1, \ldots,\ X_m\ \EXTENDS\ B_m$,
-and a parameterized type \code{C<$T_1, \ldots,\ T_l$>}.
+and a parameterized type $T$ of the form \code{C<$T_1, \ldots,\ T_l$>}.
 
 \LMHash{}
 It is a static warning if $m \not= l$.
-It is a static warning if there exists a $j$
-such that $T_j$ is not a subtype of $[T_1/X_1, \ldots, T_m/X_m]B_j$.
+It is a static warning if $T$ is not well-bounded
+(\ref{superBoundedTypes}).
 
 \commentary{
 That is, if the number of type arguments is wrong,
-or if the $j$th actual type argument is not a subtype of the corresponding bound, where each formal type parameter has been replaced by the corresponding actual type argument.
+or one or more of the upper bounds has been violated.
 }
 
 \LMHash{}
@@ -2829,16 +2858,16 @@
 Consider a generic type alias declaration $G$ named \code{F} with formal type parameter declarations
 $X_1\ \EXTENDS\ B_1, \ldots,\ X_m\ \EXTENDS\ B_m$,
 and right hand side $T$,
-and the parameterized type \code{F<$T_1, \ldots,\ T_l$>}.
+and the parameterized type $S$ of the form \code{F<$T_1, \ldots,\ T_l$>}.
 
 \LMHash{}
 It is a static warning if $m \not= l$.
-It is a static warning if there exists a $j$
-such that $T_j$ is not a subtype of $[T_1/X_1, \ldots, T_m/X_m]B_j$.
+It is a static warning if $S$ is not well-bounded
+(\ref{superBoundedTypes}).
 
 \commentary{
 That is, if the number of type arguments is wrong,
-or if the $j$th actual type argument violates the bound.
+or one or more of the upper bounds has been violated.
 }
 
 \LMHash{}
@@ -2856,6 +2885,11 @@
 }
 
 \LMHash{}
+A {\em generic type} is a type which is introduced by
+a generic class declaration or a generic type alias,
+or it is the type \code{FutureOr}.
+
+\LMHash{}
 A {\em generic function declaration} introduces a generic function (\ref{formalParameters}) into the enclosing scope.
 Consider a function invocation expression of the form
 \code{f<$T_1, \ldots,\ T_l$>(\ldots)},
@@ -2869,7 +2903,8 @@
 
 \commentary{
 That is, if the number of type arguments is wrong,
-or if the $j$th actual type argument is not a subtype of the corresponding bound, where each formal type parameter has been replaced by the corresponding actual type argument.
+or if the $j$th actual type argument is not a subtype of the corresponding bound,
+where each formal type parameter has been replaced by the corresponding actual type argument.
 }
 
 \begin{grammar}
@@ -2972,6 +3007,358 @@
 %By current rules, this is illegal. Make sure we preserve this.
 
 
+\subsection{Variance}
+\LMLabel{variance}
+
+\LMHash{}
+We say that a type $S$ {\em occurs covariantly} in a type $T$ if{}f
+$S$ occurs in a covariant position in $T$,
+but not in a contravariant position,
+and not in an invariant position.
+
+\LMHash{}
+We say that a type $S$ {\em occurs contravariantly} in a type $T$ if{}f
+$S$ occurs in a contravariant position in $T$,
+but not in a covariant position,
+and not in an invariant position.
+
+\LMHash{}
+We say that a type $S$ {\em occurs invariantly} in a type $T$ if{}f
+$S$ occurs in an invariant position in $T$,
+or $S$ occurs in a covariant position as well as a contravariant position.
+
+\LMHash{}
+We say that a type $S$ occurs {\em in a covariant position} in a type $T$
+if{}f one of the following conditions is true:
+
+\begin{itemize}
+\item $T$ is $S$
+
+\item $T$ is of the form \code{$G$<$S_1,\ \ldots,\ S_n$>}
+  where $G$ denotes a generic class
+  and $S$ occurs in a covariant position in $S_j$ for some $j \in 1 .. n$.
+
+\item $T$ is of the form
+  \code{$S_0$ \FUNCTION<$X_1\ \EXTENDS\ B_1, \ldots$>($S_1\ x_1, \ldots$)}
+  where the type parameter list may be omitted,
+  and $S$ occurs in a covariant position in $S_0$.
+
+\item $T$ is of the form
+
+  \code{$S_0$ \FUNCTION<$X_1\ \EXTENDS\ B_1, \ldots$>}
+
+  \code{\quad($S_1\ x_1, \ldots,\ S_k\ x_k,
+    $ [$S_{k+1}\ x_{k+1} = d_{k+1}, \ldots,\ S_n\ x_n = d_n$])}
+
+  \noindent
+  or of the form
+
+  \code{$S_0$ \FUNCTION<$X_1\ \EXTENDS\ B_1, \ldots$>}
+
+  \code{\quad($S_1\ x_1, \ldots,\ S_k\ x_k,
+    $ \{$S_{k+1}\ x_{k+1} = d_{k+1}, \ldots,\ S_n\ x_n = d_n$\})}
+
+  \noindent
+  where the type parameter list and each default value may be omitted,
+  and $S$ occurs in a contravariant position in $S_j$
+  for some $j \in 1 .. n$.
+
+\item $T$ is of the form \code{$G$<$S_1, \ldots,\ S_n$>}
+  where $G$ denotes a parameterized type alias such that
+  $j \in 1 .. n$,
+  the formal type parameter corresponding to $S_j$ is covariant,
+  and $S$ occurs in a covariant position in $S_j$.
+
+\item $T$ is of the form \code{$G$<$S_1, \ldots,\ S_n$>}
+  where $G$ denotes a parameterized type alias such that
+  $j \in 1 .. n$,
+  the formal type parameter corresponding to $S_j$ is contravariant,
+  and $S$ occurs in a contravariant position in $S_j$.
+\end{itemize}
+
+\LMHash{}
+We say that a type $S$ occurs {\em in a contravariant position} in a type $T$
+if{}f one of the following conditions is true:
+
+\begin{itemize}
+\item $T$ is of the form \code{$G$<$S_1,\ \ldots,\ S_n$>}
+  where $G$ denotes a generic class
+  and $S$ occurs in a contravariant position in $S_j$
+  for some $j \in 1 .. n$.
+
+\item $T$ is of the form
+  \code{$S_0$ \FUNCTION<$X_1\ \EXTENDS\ B_1, \ldots$>($S_1\ x_1, \ldots$)}
+  where the type parameter list may be omitted,
+  and $S$ occurs in a contravariant position in $S_0$.
+
+\item $T$ is of the form
+
+  \code{$S_0$ \FUNCTION<$X_1\ \EXTENDS\ B_1, \ldots$>}
+
+  \code{\quad($S_1\ x_1, \ldots,\ S_k\ x_k,
+    $ [$S_{k+1}\ x_{k+1} = d_{k+1}, \ldots,\ S_n\ x_n = d_n$])}
+
+  \noindent
+  or of the form
+
+  \code{$S_0$ \FUNCTION<$X_1\ \EXTENDS\ B_1, \ldots$>}
+
+  \code{\quad($S_1\ x_1, \ldots,\ S_k\ x_k,
+    $ \{$S_{k+1}\ x_{k+1} = d_{k+1}, \ldots,\ S_n\ x_n = d_n$\})}
+
+  \noindent
+  where the type parameter list and each default value may be omitted,
+  and $S$ occurs in a covariant position in $S_j$
+  for some $j \in 1 .. n$.
+
+\item $T$ is of the form \code{$G$<$S_1, \ldots,\ S_n$>}
+  where $G$ denotes a parameterized type alias such that
+  $j \in 1 .. n$,
+  the formal type parameter corresponding to $S_j$ is covariant,
+  and $S$ occurs in a contravariant position in $S_j$.
+
+\item $T$ is of the form \code{$G$<$S_1, \ldots,\ S_n$>}
+  where $G$ denotes a parameterized type alias such that
+  $j \in 1 .. n$,
+  the formal type parameter corresponding to $S_j$ is contravariant,
+  and $S$ occurs in a covariant position in $S_j$.
+\end{itemize}
+
+\LMHash{}
+We say that a type $S$ occurs {\em in an invariant position} in a type $T$
+if{}f one of the following conditions is true:
+
+\begin{itemize}
+\item $T$ is of the form \code{$G$<$S_1,\ \ldots,\ S_n$>}
+  where $G$ denotes a generic class or a parameterized type alias,
+  and $S$ occurs in an invariant position in $S_j$ for some $j \in 1 .. n$.
+
+\item $T$ is of the form
+
+  \code{$S_0$ \FUNCTION<$X_1\ \EXTENDS\ B_1, \ldots,\ X_m\ \EXTENDS\ B_m$>}
+
+  \code{\quad($S_1\ x_1, \ldots,\ S_k\ x_k,
+    $ [$S_{k+1}\ x_{k+1} = d_{k+1}, \ldots,\ S_n\ x_n = d_n$])}
+
+  \noindent
+  or of the form
+
+  \code{$S_0$ \FUNCTION<$X_1\ \EXTENDS\ B_1, \ldots,\ X_m\ \EXTENDS\ B_m$>}
+
+  \code{\quad($S_1\ x_1, \ldots,\ S_k\ x_k,
+    $ \{$S_{k+1}\ x_{k+1} = d_{k+1}, \ldots,\ S_n\ x_n = d_n$\})}
+
+  \noindent
+  where the type parameter list and each default value may be omitted,
+  and $S$ occurs in an invariant position in $S_j$
+  for some $j \in 0 .. n$,
+  or $S$ occurs in $B_i$
+  for some $i \in 1 .. m$.
+
+\item $T$ is of the form \code{$G$<$S_1, \ldots,\ S_n$>}
+  where $G$ denotes a parameterized type alias,
+  $j \in 1 .. n$,
+  the formal type parameter corresponding to $S_j$ is invariant,
+  and $S$ occurs in $S_j$.
+\end{itemize}
+
+\LMHash{}
+Consider a generic type alias declaration $G$
+with formal type parameter declarations
+$X_1\ \EXTENDS\ B_1, \ldots,\ X_m\ \EXTENDS\ B_m$,
+and right hand side $T$.
+Let $j \in 1 .. m$.
+%
+We say that {\em the formal type parameter} $X_j$ {\em is invariant}
+if{}f $X_j$ occurs invariantly in $T$,
+$X_j$ {\em is covariant} if{}f $X_j$ occurs covariantly in $T$,
+and $X_j$ {\em is contravariant} if{}f $X_j$ occurs contravariantly in $T$.
+
+\rationale{
+Variance gives a characterization of the way a type varies
+as the value of a subterm varies, e.g., a type variable:
+Assume that $T$ is a type where a type variable $X$ occurs,
+and $L$ and $U$ are types such that $L$ is a subtype of $U$.
+If $X$ occurs covariantly in $T$
+then $[L/X]T$ is a subtype of $[U/X]T$.
+Similarly, if $X$ occurs contravariantly in $T$
+then $[U/X]T$ is a subtype of $[L/X]T$.
+If $X$ occurs invariantly
+then $[L/X]T$ and $[U/X]T$ are not guaranteed to be subtypes of each other in any direction.
+In short: with covariance, the type covaries;
+with contravariance, the type contravaries;
+with invariance, all bets are off.
+}
+
+
+\subsection{Super-Bounded Types}
+\LMLabel{superBoundedTypes}
+
+\LMHash{}
+This section describes how
+the declared upper bounds of formal type parameters are enforced,
+including some cases where a limited form of violation is allowed.
+
+\LMHash{}
+A {\em top type} is a type $T$ such that \code{Object} is a subtype of $T$.
+\commentary{
+For instance, \code{Object}, \DYNAMIC, and \VOID{} are top types,
+and so are \code{FutureOr<\VOID>} and \code{FutureOr<FutureOr<\DYNAMIC>{}>}.
+}
+
+% We define the property of being regular-bounded for all types,
+% being super-bounded for parameterized types, and being well-bounded
+% for all types. We require that all types are well-bounded, which
+% covers every subterm of a type that is itself a type, and then we
+% require that types must be regular-bounded when used in certain
+% situations.
+
+\LMHash{}
+Every type which is not a parameterized type is {\em regular-bounded}.
+Let $T$ be a parameterized type of the form
+\code{$G$<$S_1, \ldots,\ S_n$>}
+where $G$ denotes a generic class or a parameterized type alias.
+Let
+\code{$X_1\ \EXTENDS\ B_1, \ldots,\ X_n\ \EXTENDS\ B_n$}
+be the formal type parameter declarations of $G$.
+$T$ is {\em regular-bounded} if{}f
+$S_j$ is a subtype of
+$[S_1/X_1, \ldots,\ S_n/X_n]B_j$,
+for all $j \in 1 .. n$.
+
+\commentary{
+This means that each actual type argument satisfies the declared upper
+bound for the corresponding formal type parameter.
+}
+
+\LMHash{}
+Let $T$ be a parameterized type of the form
+\code{$G$<$S_1, \ldots,\ S_n$>}
+where $G$ denotes a generic class or a parameterized type alias.
+$T$ is {\em super-bounded} if{}f the following conditions are both true:
+
+\begin{itemize}
+\item
+  $T$ is not regular-bounded.
+\item
+  For each $j \in 1 .. n$, let $S'_j$ be the result of replacing
+  every occurrence of a top type
+  in a covariant position in $S_j$ by \code{Null},
+  and every occurrence of \code{Null}
+  in a contravariant position in $S_j$ by \code{Object}.
+  It is then required that
+  \code{$G$<$S'_1, \ldots,\ S'_n$>}
+  is regular-bounded.
+\end{itemize}
+
+\commentary{
+In short, at least one type argument violates its bound, but the type is
+regular-bounded after replacing all occurrences of an extreme type by an
+opposite extreme type, depending on their variance.
+}
+
+\LMHash{}
+A type $T$ is {\em well-bounded} if{}f
+it is either regular-bounded or super-bounded.
+
+\LMHash{}
+Any use of a type $T$ which is not well-bounded is a compile-time error.
+
+\LMHash{}
+It is a compile-time error if a parameterized type $T$ is super-bounded
+when it is used in any of the following ways:
+\begin{itemize}
+\item $T$ is an immediate subterm of a new expression
+  (\ref{new})
+  or a constant object expression
+  (\ref{const}).
+\item $T$ is an immediate subterm of a redirecting factory constructor
+  signature
+ (\ref{redirectingFactoryConstructors}).
+\item $T$ is an immediate subterm of an \EXTENDS{} clause
+  (\ref{superclasses}),
+  or it occurs as an element in the type list of an \IMPLEMENTS{} clause
+  (\ref{superinterfaces}),
+  or a \WITH{} clause
+  (\ref{classes}).
+\end{itemize}
+
+\commentary{
+Types of members from super-bounded class types are computed using the same
+rules as types of members from other types. Types of function applications
+involving super-bounded types are computed using the same rules as types of
+function applications involving other types. Here is an example:
+}
+
+\begin{dartCode}
+\CLASS{} A<X \EXTENDS{} num> \{
+  X x;
+\}
+
+A<Object> a;
+\end{dartCode}
+
+\commentary{
+With this, \code{a.x} has static type \code{Object},
+even though the upper bound on the type variable \code{X} is \code{num}.
+}
+
+\rationale{
+Super-bounded types enable the expression of informative common supertypes
+of some sets of types whose common supertypes would otherwise be much less informative.
+For example, consider the following class:
+}
+
+\begin{dartCode}
+\CLASS{} C<X \EXTENDS{} C<X>$\!$> \{
+  X next;
+\}
+\end{dartCode}
+
+\rationale{
+Without super-bounded types,
+there is no type $T$ which makes \code{C<$T$>} a common supertype of
+all types of the form \code{C<$S$>}
+(noting that all types must be regular-bounded
+when we do not have the notion of super-bounded types).
+So if we wish to allow a variable to hold any instance ``of type \code{C}''
+then that variable must use \code{Object} or another top type
+as its type annotation,
+which means that a member like \code{next} is not known to exist
+(which is what we mean by saying that the type is `less informative').
+
+We could introduce a notion of recursive (infinite) types, and express
+the least upper bound of all types of the form \code{C<$S$>} as
+some syntax whose meaning could be approximated by
+\code{C<C<C<C<$\ldots$>$\!$>$\!$>$\!$>}.
+
+However, we expect that any such concept in Dart would incur a significant cost
+on developers and implementations in terms of added complexity and subtlety,
+so we have chosen not to do that.
+Super-bounded types are finite,
+but they offer a useful developer-controlled approximation to such infinite types.
+}
+
+\commentary{
+For example,
+\code{C<Object>} and
+\code{C<C<C<\VOID>{}>{}>}
+are types that a developer may choose to use as a type annotation.
+This choice serves as a commitment to
+a finite level of unfolding of the infinite type,
+and it allows for a certain amount of control
+at the point where the unfolding ends:
+%
+If \code{c} has type \code{C<C<\DYNAMIC>{}>}
+then \code{c.next.next} has type \DYNAMIC{}
+and \code{c.next.next.whatever} has no compile-time error,
+but if \code{c} has type \code{C<C<\VOID>{}>} then
+\code{Object x = c.next.next;} is a compile-time error.
+It is thus possible for developers to get a more or less strict treatment
+of expressions whose type proceeds beyond the given finite unfolding.
+}
+
+
 \section{Metadata}
 \LMLabel{metadata}
 
@@ -3636,7 +4023,7 @@
 An unescaped \$ character in a string signifies the beginning of an interpolated expression.
 The \$ sign may be followed by either:
 \begin{itemize}
-\item A single identifier $id$ that must not contain the \$ character.
+\item A single identifier \id{} that must not contain the \$ character.
 \item An expression $e$ delimited by curly braces.
 \end{itemize}
 
@@ -3665,10 +4052,10 @@
 \end{grammar}
 
 \LMHash{}
-A symbol literal \code{\#$id$} where $id$ does not begin with an underscore ('\code{\_}') is equivalent to the expression \code{\CONST{} Symbol('$id$')}.
+A symbol literal \code{\#\id} where \id{} does not begin with an underscore ('\code{\_}') is equivalent to the expression \code{\CONST{} Symbol('\id')}.
 
 \LMHash{}
-A symbol literal \code{\#\_$id$} evaluates to the object that would be returned by the call \code{MirrorSystem.getSymbol("\_$id$", \metavar{libraryMirror})} where \metavar{libraryMirror} is an instance of the class \code{LibraryMirror} defined in the library \code{dart:mirrors}, reflecting the current library.
+A symbol literal \code{\#\_\id} evaluates to the object that would be returned by the call \code{MirrorSystem.getSymbol("\_\id", \metavar{libraryMirror})} where \metavar{libraryMirror} is an instance of the class \code{LibraryMirror} defined in the library \code{dart:mirrors}, reflecting the current library.
 
 \rationale{
 One may well ask what is the motivation for introducing literal symbols? In some languages, symbols are canonicalized whereas strings are not.
@@ -4169,11 +4556,11 @@
 It is a static type warning if
 the type $T$ in an instance creation expression of one of the forms
 
-\code{\NEW{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
+\code{\NEW{} $T$.\id($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
 
 \code{\NEW{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
 
-\code{\CONST{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
+\code{\CONST{} $T$.\id($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
 
 \code{\CONST{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 is malformed (\ref{dynamicTypeSystem}) or malbounded (\ref{parameterizedTypes}).
@@ -4181,11 +4568,11 @@
 \LMHash{}
 It is a compile-time error if the type $T$ in an instance creation expression of one of the forms
 
-\code{\NEW{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
+\code{\NEW{} $T$.\id($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
 
 \code{\NEW{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
 
-\code{\CONST{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
+\code{\CONST{} $T$.\id($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
 
 \code{\CONST{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 
@@ -4207,7 +4594,7 @@
 \LMHash{}
 Let $e$ be a new expression of the form
 
-\code{\NEW{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+\code{\NEW{} $T$.\id($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 or the form
 
 \code{\NEW{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
@@ -4223,8 +4610,8 @@
 \begin{itemize}
 \item
 If $e$ is of the form
-\code{\NEW{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
-it is a static warning if $T.id$ is not the name of a constructor declared by the type $T$.
+\code{\NEW{} $T$.\id($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+it is a static warning if \code{$T$.\id} is not the name of a constructor declared by the type $T$.
 \item
 If $e$ is of the form
 \code{\NEW{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
@@ -4241,8 +4628,8 @@
 %error if $S$ is not a generic (\ref{generics}) type with $m$ type parameters.
 If $T$ is not a parameterized type, let $R = T$.
 Furthermore, if $e$ is of the form
-\code{\NEW{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
-then let $q$ be the constructor $T.id$, otherwise let $q$ be the constructor $T$.
+\code{\NEW{} $T$.\id($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+then let $q$ be the constructor \code{$T$.\id}, otherwise let $q$ be the constructor $T$.
 
 \LMHash{}
 If $R$ is a generic with $l = m$ type parameters then
@@ -4297,9 +4684,12 @@
 Then:
 
 \LMHash{}
-If $q$ is a redirecting factory constructor of the form $T(p_1, \ldots,\ p_{n+k}) = c;$ or of the form $T.id(p_1, \ldots,\ p_{n+k}) = c;$ then the result of the evaluation of $e$ is equivalent to evaluating the expression
+If $q$ is a redirecting factory constructor of the form $T(p_1, \ldots,\ p_{n+k}) = c;$ or of the form \code{$T$.\id($p_1, \ldots,\ p_{n+k}$) = $c$;} then the result of the evaluation of $e$ is equivalent to evaluating the expression
 
-$[V_1/T_1, \ldots, V_m/T_m]($\code{\NEW{} $c(a_1, \ldots,\ a_n, x_{n+1}: a_{n+1}, \ldots,\ x_{n+k}: a_{n+k}))$}.
+\code{[$V_1/X_1, \ldots, V_m/X_m$](\NEW{} $c$($a_1, \ldots,\ a_n, x_{n+1}: a_{n+1}, \ldots,\ x_{n+k}: a_{n+k}$))}
+
+\noindent
+where $X_1, \ldots,\ X_m$ are the formal type parameters of $R$.
 If evaluation of $q$ causes $q$ to be re-evaluated cyclically, with only factory constructor redirections in-between, a run-time error occurs.
 % Used to not have the "in-between" clause, which would disallow a factory constructor redirecting to another constructor which conditionally calls the original factory constructor again with different arguments.
 
@@ -4327,14 +4717,14 @@
 \LMHash{}
 The static type of an instance creation expression of either the form
 
-\code{\NEW{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+\code{\NEW{} $T$.\id($a_1, \ldots,\ a_n,\ x_{n+1}:\ a_{n+1}, \ldots,\ x_{n+k}:\ a_{n+k}$)}
 
 or the form
 
-\code{\NEW{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+\code{\NEW{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}:\ a_{n+1}, \ldots,\ x_{n+k}:\ a_{n+k}$)}
 
 is $T$.
-It is a static warning if the static type of $a_i, 1 \le i \le n + k$ may not be assigned to the type of the corresponding formal parameter of the constructor $T.id$ (respectively $T$).
+It is a static warning if the static type of $a_i, 1 \le i \le n + k$ may not be assigned to the type of the corresponding formal parameter of the constructor \code{$T$.\id} (respectively $T$).
 
 
 \subsubsection{Const}
@@ -4351,10 +4741,10 @@
 \LMHash{}
 Let $e$ be a constant object expression of the form
 
-\code{\CONST{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+\code{\CONST{} $T$.\id($a_1, \ldots,\ a_n,\ x_{n+1}:\ a_{n+1}, \ldots,\ x_{n+k}:\ a_{n+k}$)}
 
 or the form
-\code{\CONST{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
+\code{\CONST{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}:\ a_{n+1}, \ldots,\ x_{n+k}:\ a_{n+k}$)}.
 It is a compile-time error if $T$ does not denote a class accessible in the current scope.
 It is a compile-time error if $T$ is a deferred type (\ref{staticTypes}).
 
@@ -4367,8 +4757,8 @@
 
 \LMHash{}
 If $e$ is of the form
-\code{\CONST{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
-it is a compile-time error if $T.id$ is not the name of a constant constructor declared by the type $T$.
+\code{\CONST{} $T$.\id($a_1, \ldots,\ a_n,\ x_{n+1}:\ a_{n+1}, \ldots,\ x_{n+k}:\ a_{n+k}$)}
+it is a compile-time error if \code{$T$.\id} is not the name of a constant constructor declared by the type $T$.
 If $e$ is of the form
 \code{\CONST{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 it is a compile-time error if the type $T$ does not declare a constant constructor with the same name as the declaration of $T$.
@@ -4386,11 +4776,11 @@
 \LMHash{}
 First, if $e$ is of the form
 
-\code{\CONST{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+\code{\CONST{} $T$.\id($a_1, \ldots,\ a_n,\ x_{n+1}:\ a_{n+1}, \ldots,\ x_{n+k}:\ a_{n+k}$)}
 
 then let $i$ be the value of the expression
 
-\code{\NEW{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
+\code{\NEW{} $T$.\id($a_1, \ldots,\ a_n,\ x_{n+1}:\ a_{n+1}, \ldots,\ x_{n+k}:\ a_{n+k}$)}.
 
 \LMHash{}
 Otherwise, $e$ must be of the form
@@ -4424,14 +4814,14 @@
 \LMHash{}
 The static type of a constant object expression of either the form
 
-\code{\CONST{} $T.id$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+\code{\CONST{} $T$.\id($a_1, \ldots,\ a_n,\ x_{n+1}:\ a_{n+1}, \ldots,\ x_{n+k}:\ a_{n+k}$)}
 
 or the form
 
-\code{\CONST{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
+\code{\CONST{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}:\ a_{n+1}, \ldots,\ x_{n+k}:\ a_{n+k}$)}
 
 is $T$.
-It is a static warning if the static type of $a_i, 1 \le i \le n+ k$ may not be assigned to the type of the corresponding formal parameter of the constructor $T.id$ (respectively $T$).
+It is a static warning if the static type of $a_i, 1 \le i \le n+ k$ may not be assigned to the type of the corresponding formal parameter of the constructor \code{$T$.\id} (respectively $T$).
 
 \LMHash{}
 It is a compile-time error if evaluation of a constant object results in an uncaught exception being thrown.
@@ -4785,23 +5175,23 @@
 \LMHash{}
 An unqualified function invocation $i$ has the form
 
-\code{$id$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
+\code{\id<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
 
 \noindent
-where $id$ is an identifier.
+where \id{} is an identifier.
 
 \commentary{
 Note that the type argument list is omitted when $r = 0$ (\ref{generics}).
 }
 
 \LMHash{}
-If there exists a lexically visible declaration named $id$, let $f_{id}$ be the innermost such declaration.
+If there exists a lexically visible declaration named \id, let $f_{id}$ be the innermost such declaration.
 Then:
 \begin{itemize}
 \item
-If $id$ is a type literal, then $i$ is interpreted as a function expression invocation (\ref{functionExpressionInvocation}) with $(id)$ as the expression $e_f$.
+If \id{} is a type literal, then $i$ is interpreted as a function expression invocation (\ref{functionExpressionInvocation}) with $(\id)$ as the expression $e_f$.
 \commentary{
-The expression $(id)$ where $id$ is a type literal always evaluates to an instance of class \code{Type} which is not a function.
+The expression $(\id)$ where \id{} is a type literal always evaluates to an instance of class \code{Type} which is not a function.
 This ensures that a run-time error occurs when trying to call a type literal.
 }
 \item
@@ -4810,10 +5200,10 @@
 If $f_{id}$ is a local function, a library function, a library or static getter or a variable then $i$ is interpreted as a function expression invocation (\ref{functionExpressionInvocation}).
 \item
 Otherwise, if $f_{id}$ is a static method of the enclosing class $C$, $i$ is equivalent to
-\code{$C.id$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
+\code{$C$.\id<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}:\ a_{n+1}, \ldots,\ x_{n+k}:\ a_{n+k}$)}.
 \item Otherwise, $f_{id}$ is equivalent to the ordinary method invocation
 
-\code{\THIS{}.$id$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
+\code{\THIS{}.\id<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 \end{itemize}
 
 \LMHash{}
@@ -4821,10 +5211,10 @@
 
 \LMHash{}
 If $i$ does not occur inside a top level or static function, $i$ is equivalent to
-\code{\THIS{}.$id$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
+\code{\THIS{}.\id<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 
 % Should also say:
-% It is a static warning if $i$ occurs inside a top level or static function (be it function, method, getter, or setter) or variable initializer and there is no lexically visible declaration named $id$ in scope.
+% It is a static warning if $i$ occurs inside a top level or static function (be it function, method, getter, or setter) or variable initializer and there is no lexically visible declaration named \id{} in scope.
 
 
 \subsubsection{Function Expression Invocation}
@@ -4843,7 +5233,7 @@
 }
 
 \LMHash{}
-If $e_f$ is an identifier $id$, then $id$ must necessarily denote a local function, a library function, a library or static getter or a variable as described above, or $i$ is not considered a function expression invocation.
+If $e_f$ is an identifier \id, then \id{} must necessarily denote a local function, a library function, a library or static getter or a variable as described above, or $i$ is not considered a function expression invocation.
 If $e_f$ is a type literal, then it is equivalent to the expression $(e_f)$.
 
 \commentary{
@@ -5482,7 +5872,7 @@
 
 \LMHash{}
 Evaluation of a {\em conditional property extraction expression} $e$
-of the form \code{$e_1$?.\metavar{id}} proceeds as follows:
+of the form \code{$e_1$?.\id} proceeds as follows:
 
 \LMHash{}
 If $e_1$ is a type literal, $e$ is equivalent to \code{$e_1$.$m$}.
@@ -5491,12 +5881,12 @@
 Otherwise evaluate $e_1$ to an object $o$.
 If $o$ is the null object, $e$ evaluates to the null object (\ref{null}).
 Otherwise let $x$ be a fresh variable bound to $o$
-and evaluate \code{$x$.\metavar{id}} to a value $r$.
+and evaluate \code{$x$.\id} to a value $r$.
 Then $e$ evaluates to $r$.
 
-The static type of $e$ is the same as the static type of \code{$e_1$.\metavar{id}}.
+The static type of $e$ is the same as the static type of \code{$e_1$.\id}.
 Let $T$ be the static type of $e_1$ and let $y$ be a fresh variable of type $T$.
-Exactly the same static warnings that would be caused by \code{$y$.\metavar{id}} are also generated in the case of \code{$e_1$?.\metavar{id}}.
+Exactly the same static warnings that would be caused by \code{$y$.\id} are also generated in the case of \code{$e_1$?.\id}.
 
 \LMHash{}
 Unconditional property extraction has one of two syntactic forms: $e.m$ (\ref{getterAccessAndMethodExtraction}) or $\SUPER.m$ (\ref{superGetterAccessAndMethodClosurization}), where $e$ is an expression and $m$ is an identifier.
@@ -6849,18 +7239,18 @@
 \end{itemize}
 
 \LMHash{}
-An assignable expression of the form $id$ is evaluated as an identifier expression (\ref{identifierReference}).
+An assignable expression of the form \id{} is evaluated as an identifier expression (\ref{identifierReference}).
 
-%An assignable expression of the form $e.id(a_1, \ldots, a_n)$ is evaluated as a method invocation (\ref{methodInvocation}).
+%An assignable expression of the form \code{$e$.\id($a_1, \ldots, a_n$)} is evaluated as a method invocation (\ref{methodInvocation}).
 
 \LMHash{}
-An assignable expression of the form $e.id$ or $e?.id$ is evaluated as a property extraction (\ref{propertyExtraction}).
+An assignable expression of the form \code{$e$.\id} or \code{$e$?.\id} is evaluated as a property extraction (\ref{propertyExtraction}).
 
 \LMHash{}
 An assignable expression of the form \code{$e_1$[$e_2$]} is evaluated as a method invocation of the operator method \code{[]} on $e_1$ with argument $e_2$.
 
 \LMHash{}
-An assignable expression of the form \code{\SUPER{}.id} is evaluated as a property extraction.
+An assignable expression of the form \code{\SUPER{}.\id} is evaluated as a property extraction.
 
 \LMHash{}
 Evaluation of an assignable expression of the form \code{\SUPER{}[$e_2$]} is equivalent to evaluation of the method invocation \code{\SUPER{}.[]($e_2$)}.
@@ -6950,12 +7340,12 @@
 }
 
 \LMHash{}
-Evaluation of an identifier expression $e$ of the form $id$ proceeds as follows:
+Evaluation of an identifier expression $e$ of the form \id{} proceeds as follows:
 
 \LMHash{}
-Let $d$ be the innermost declaration in the enclosing lexical scope whose name is $id$ or $id=$.
-If no such declaration exists in the lexical scope, let $d$ be the declaration of the inherited member named $id$ if it exists.
-%If no such member exists, let $d$ be the declaration of the static member name $id$ declared in a superclass of the current class, if it exists.
+Let $d$ be the innermost declaration in the enclosing lexical scope whose name is \id{} or \code{\id=}.
+If no such declaration exists in the lexical scope, let $d$ be the declaration of the inherited member named \id{} if it exists.
+%If no such member exists, let $d$ be the declaration of the static member name \id{} declared in a superclass of the current class, if it exists.
 
 \begin{itemize}
 \item if $d$ is a prefix $p$, a compile-time error occurs unless the token immediately following $d$ is \code{'.'}.
@@ -6967,17 +7357,17 @@
 %\item If $d$ is a library variable then:
 %  \begin{itemize}
 %  \item If $d$ is of one of the forms \code{\VAR{} $v$ = $e_i$;} , \code{$T$ $v$ = $e_i$;} , \code{\FINAL{} $v$ = $e_i$;} or \code{\FINAL{} $T$ $v$ = $e_i$;} and no value has yet been stored into $v$ then the initializer expression $e_i$ is evaluated. If, during the evaluation of $e_i$, the getter for $v$ is referenced, a \code{CyclicInitializationError} is thrown. If the evaluation succeeded yielding an object $o$, let $r$ be $o$, otherwise let $r$ be the null object (\ref{null}). In any case, $r$ is stored into $v$. The value of $e$ is $r$.
-\item If $d$ is a constant variable of one of the forms \code{\CONST{} $v$ = $e$;} or \code{\CONST{} $T$ $v$ = $e$;} then the value $id$ is the value of the compile-time constant $e$.
+\item If $d$ is a constant variable of one of the forms \code{\CONST{} $v$ = $e$;} or \code{\CONST{} $T$ $v$ = $e$;} then the value \id{} is the value of the compile-time constant $e$.
 %  Otherwise
-%  \item $e$ evaluates to the current binding of $id$.
+%  \item $e$ evaluates to the current binding of \id.
 %  \end{itemize}
-\item If $d$ is a local variable or formal parameter then $e$ evaluates to the current binding of $id$.
-%\item If $d$ is a library variable, local variable, or formal parameter, then $e$ evaluates to the current binding of $id$. \commentary{This case also applies if d is a library or local function declaration, as these are equivalent to function-valued variable declarations.}
+\item If $d$ is a local variable or formal parameter then $e$ evaluates to the current binding of \id.
+%\item If $d$ is a library variable, local variable, or formal parameter, then $e$ evaluates to the current binding of \id. \commentary{This case also applies if d is a library or local function declaration, as these are equivalent to function-valued variable declarations.}
 \item If $d$ is a static method, top-level function or local function then $e$ evaluates to the function object obtained by closurization (\ref{functionClosurization}) of the declaration denoted by $d$.
-\item If $d$ is the declaration of a static variable, static getter or static setter declared in class $C$, then evaluation of $e$ is equivalent to evaluation of the property extraction (\ref{propertyExtraction}) $C.id$.
-\item If $d$ is the declaration of a library variable, top-level getter or top-level setter, then evaluation of $e$ is equivalent to evaluation of the top level getter invocation (\ref{topLevelGetterInvocation}) $id$.
+\item If $d$ is the declaration of a static variable, static getter or static setter declared in class $C$, then evaluation of $e$ is equivalent to evaluation of the property extraction (\ref{propertyExtraction}) \code{$C$.\id}.
+\item If $d$ is the declaration of a library variable, top-level getter or top-level setter, then evaluation of $e$ is equivalent to evaluation of the top level getter invocation (\ref{topLevelGetterInvocation}) \id.
 \item Otherwise, if $e$ occurs inside a top level or static function (be it function, method, getter, or setter) or variable initializer, evaluation of $e$ causes a \code{NoSuchMethod} to be thrown.
-\item Otherwise, evaluation of $e$ is equivalent to evaluation of the property extraction (\ref{propertyExtraction}) \THIS{}.$id$.
+\item Otherwise, evaluation of $e$ is equivalent to evaluation of the property extraction (\ref{propertyExtraction}) \THIS{}.\id.
 % This implies that referring to an undefined static getter by simple name is an error, whereas doing so by qualified name is only a warning. Same with assignments.  Revise?
 \end{itemize}
 
@@ -6986,12 +7376,12 @@
 
 \begin{itemize}
 \item If $d$ is a class, type alias or type parameter the static type of $e$ is \code{Type}.
-\item If $d$ is a local variable or formal parameter the static type of $e$ is the type of the variable $id$, unless $id$ is known to have some type $T$, in which case the static type of $e$ is $T$, provided that $T$ is more specific than any other type $S$ such that $v$ is known to have type $S$.
+\item If $d$ is a local variable or formal parameter the static type of $e$ is the type of the variable \id, unless \id{} is known to have some type $T$, in which case the static type of $e$ is $T$, provided that $T$ is more specific than any other type $S$ such that $v$ is known to have type $S$.
 \item If $d$ is a static method, top-level function or local function the static type of $e$ is the function type defined by $d$.
-\item If $d$ is the declaration of a static variable, static getter or static setter declared in class $C$, the static type of $e$ is the static type of the getter invocation (\ref{propertyExtraction}) $C.id$.
-\item If $d$ is the declaration of a library variable, top-level getter or top-level setter, the static type of $e$ is the static type of the top level getter invocation $id$.
+\item If $d$ is the declaration of a static variable, static getter or static setter declared in class $C$, the static type of $e$ is the static type of the getter invocation (\ref{propertyExtraction}) \code{$C$.\id}.
+\item If $d$ is the declaration of a library variable, top-level getter or top-level setter, the static type of $e$ is the static type of the top level getter invocation \id.
 \item Otherwise, if $e$ occurs inside a top level or static function (be it function, method, getter, or setter) or variable initializer, the static type of $e$ is \DYNAMIC{}.
-\item Otherwise, the static type of $e$ is the type of the property extraction (\ref{propertyExtraction}) \THIS{}.$id$.
+\item Otherwise, the static type of $e$ is the type of the property extraction (\ref{propertyExtraction}) \THIS{}.\id.
 \end{itemize}
 
 \commentary{
@@ -7004,7 +7394,7 @@
 }
 
 \LMHash{}
-It is a static warning if an identifier expression $id$ occurs inside a top level or static function (be it function, method, getter, or setter) or variable initializer and there is no declaration $d$ with name $id$ in the lexical scope enclosing the expression.
+It is a static warning if an identifier expression \id{} occurs inside a top level or static function (be it function, method, getter, or setter) or variable initializer and there is no declaration $d$ with name \id{} in the lexical scope enclosing the expression.
 
 
 \subsection{Type Test}
@@ -7252,7 +7642,11 @@
 \end{grammar}
 
 \LMHash{}
-A function declaration statement of one of the forms $id$ $signature$ $\{ statements \}$ or $T$ $id$ $signature$ $\{ statements \}$ causes a new function named $id$ to be added to the innermost enclosing scope.
+A function declaration statement of one of the forms
+\code{\id{} \metavar{signature} \{ \metavar{statements} \}}
+or
+\code{$T$ \id{} \metavar{signature} \{ \metavar{statements} \}}
+causes a new function named \id{} to be added to the innermost enclosing scope.
 It is a compile-time error to reference a local function before its declaration.
 
 \commentary{
@@ -7448,12 +7842,12 @@
 \LMHash{}
 Let $D$ be derived from \code{finalConstVarOrType?}
 and let $n0$ be an identifier that does not occur anywhere in the program.
-A for statement of the form \code{\FOR{} ($D$ $id$ \IN{} $e$) $s$} is equivalent to the following code:
+A for statement of the form \code{\FOR{} ($D$ \id{} \IN{} $e$) $s$} is equivalent to the following code:
 
 \begin{dartCode}
 \VAR{} $n0$ = $e$.iterator;
 \WHILE{} ($n0$.moveNext()) \{
-   $D$ $id$ = $n0$.current;
+   $D$ \id{} = $n0$.current;
    $s$
 \}
 \end{dartCode}
@@ -7463,7 +7857,7 @@
 where $T$ is the static type of \code{$e$.iterator}.
 
 \commentary{
-It follows that it is a static warning if $D$ is empty and $id$ is a final variable,
+It follows that it is a static warning if $D$ is empty and \id{} is a final variable,
 and a dynamic error will then occur if the body is executed.
 }
 
@@ -7479,13 +7873,13 @@
 \LMHash{}
 Let $D$ be derived from \code{finalConstVarOrType?}.
 Execution of a for-in statement, $f$, of the form
-\code{\AWAIT{} \FOR{} ($D$ $id$ \IN{} $e$) $s$}
+\code{\AWAIT{} \FOR{} ($D$ \id{} \IN{} $e$) $s$}
 proceeds as follows:
 
 \LMHash{}
 The expression $e$ is evaluated to an object $o$.
 It is a dynamic error if $o$ is not an instance of a class that implements \code{Stream}.
-It is a static warning if $D$ is empty and $id$ is a final variable,
+It is a static warning if $D$ is empty and \id{} is a final variable,
 and it is then a dynamic error if the body is executed.
 
 \LMHash{}
@@ -7507,7 +7901,7 @@
 
 \LMHash{}
 For each {\em data event} from $u$,
-the statement $s$ is executed with $id$ bound to the value of the current data event.
+the statement $s$ is executed with \id{} bound to the value of the current data event.
 
 \commentary{
 Either execution of $s$ is completely synchronous, or it contains an
@@ -7707,7 +8101,7 @@
 proceeds as follows:
 
 \LMHash{}
-The statement \code{\VAR{} $id$ = $e$;} is evaluated, where $id$ is a fresh variable.
+The statement \code{\VAR{} \id{} = $e$;} is evaluated, where \id{} is a fresh variable.
 In checked mode, it is a run-time error if the value of $e$ is not an instance of the same class as the constants $e_1, \ldots, e_n$.
 
 \commentary{
@@ -7715,7 +8109,7 @@
 }
 
 \LMHash{}
-Next, the case clause \CASE{} $e_{1}$: $s_{1}$ is matched against $id$, if $n > 0$.
+Next, the case clause \CASE{} $e_{1}$: $s_{1}$ is matched against \id, if $n > 0$.
 Otherwise if there is a \DEFAULT{} clause, the case statements $s_{n+1}$ are executed (\ref{case-execute}).
 
 \LMHash{}
@@ -7730,11 +8124,11 @@
 \}
 \end{dartCode}
 
-against the value of a variable $id$ proceeds as follows:
+against the value of a variable \id{} proceeds as follows:
 
 \LMHash{}
-The expression \code{$e_k$ == $id$} is evaluated to an object $o$ which is then subjected to boolean conversion evaluating to a value $v$.
-If $v$ is not \TRUE{} the following case, \CASE{} $e_{k+1}: s_{k+1}$ is matched against $id$ if $k < n$.
+The expression \code{$e_k$ == \id} is evaluated to an object $o$ which is then subjected to boolean conversion evaluating to a value $v$.
+If $v$ is not \TRUE{} the following case, \CASE{} $e_{k+1}: s_{k+1}$ is matched against \id{} if $k < n$.
 If $k = n$, then the \DEFAULT{} clause's statements are executed (\ref{case-execute}).
 If $v$ is \TRUE{}, let $h$ be the smallest number such that $h \ge k$ and $s_h$ is non-empty.
 If no such $h$ exists, let $h = n + 1$.
@@ -7751,11 +8145,11 @@
 \}
 \end{dartCode}
 
-against the value of a variable $id$ proceeds as follows:
+against the value of a variable \id{} proceeds as follows:
 
 \LMHash{}
-The expression \code{$e_k$ == $id$} is evaluated to an object $o$ which is then subjected to boolean conversion evaluating to a value $v$.
-If $v$ is not \TRUE{} the following case, \CASE{} $e_{k+1}: s_{k+1}$ is matched against $id$ if $k < n$.
+The expression \code{$e_k$ == \id} is evaluated to an object $o$ which is then subjected to boolean conversion evaluating to a value $v$.
+If $v$ is not \TRUE{} the following case, \CASE{} $e_{k+1}: s_{k+1}$ is matched against \id{} if $k < n$.
 If $v$ is \TRUE{}, let $h$ be the smallest integer such that $h \ge k$ and $s_h$ is non-empty.
 If such a $h$ exists, the case statements $s_h$ are executed (\ref{case-execute}).
 Otherwise the switch statement completes normally (\ref{completion}).
@@ -8534,7 +8928,7 @@
 The import modifies the namespace of the current library in a manner that is determined by the imported library and by the optional elements of the import.
 
 \LMHash{}
-An immediate import directive $I$ may optionally include a prefix clause of the form \code{\AS{} $id$} used to prefix names imported by $I$.
+An immediate import directive $I$ may optionally include a prefix clause of the form \code{\AS{} \id} used to prefix names imported by $I$.
 A deferred import must include a prefix clause or a compile-time error occurs.
 It is a compile-time error if a prefix used in a deferred import is used in another import clause.
 
@@ -8557,13 +8951,13 @@
 When called, the method causes an immediate import $I'$ to be executed at some future time, where $I'$ is derived from $I$ by eliding the word \DEFERRED{} and adding a \HIDE{} \code{loadLibrary} combinator clause.
 When $I'$ executes without error, $f$ completes successfully.
 If $I'$ executes without error, we say that the call to \code{loadLibrary} has succeeded, otherwise we say the call has failed.
-\item For every top level function $f$ named $id$ in the imported library $B$, a corresponding method named $id$ with the same signature as $f$.
+\item For every top level function $f$ named \id{} in the imported library $B$, a corresponding method named \id{} with the same signature as $f$.
 Calling the method results in a run-time error.
-\item For every top level getter $g$ named $id$ in $B$, a corresponding getter named $id$ with the same signature as $g$.
+\item For every top level getter $g$ named \id{} in $B$, a corresponding getter named \id{} with the same signature as $g$.
 Calling the method results in a run-time error.
-\item For every top level setter $s$ named $id$ in $B$, a corresponding setter named $id$ with the same signature as $s$.
+\item For every top level setter $s$ named \id{} in $B$, a corresponding setter named \id{} with the same signature as $s$.
 Calling the method results in a run-time error.
-\item For every type $T$ named $id$ in $B$, a corresponding getter named $id$ with return type \code{Type}.
+\item For every type $T$ named \id{} in $B$, a corresponding getter named \id{} with return type \code{Type}.
 Calling the method results in a run-time error.
 \end{itemize}
 
@@ -8642,10 +9036,10 @@
 Next, if $I$ includes a prefix clause of the form \AS{} $p$, let $NS = NS_n \cup \{p: prefixObject(NS_n)\}$ where $prefixObject(NS_n)$ is a {\em prefix object} for the namespace $NS_n$, which is an object that has the following members:
 
 \begin{itemize}
-\item For every top level function $f$ named $id$ in $NS_n$, a corresponding method with the same name and signature as $f$ that forwards (\ref{functionDeclarations}) to $f$.
-\item For every top level getter with the same name and signature as $g$ named $id$ in $NS_n$, a corresponding getter that forwards to $g$.
-\item For every top level setter $s$ with the same name and signature as named $id$ in $NS_n$, a corresponding setter that forwards to $s$.
-\item For every type $T$ named $id$ in $NS_n$, a corresponding getter named $id$ with return type \code{Type}, that, when invoked, returns the type object for $T$.
+\item For every top level function $f$ named \id{} in $NS_n$, a corresponding method with the same name and signature as $f$ that forwards (\ref{functionDeclarations}) to $f$.
+\item For every top level getter with the same name and signature as $g$ named \id{} in $NS_n$, a corresponding getter that forwards to $g$.
+\item For every top level setter $s$ with the same name and signature as named \id{} in $NS_n$, a corresponding setter that forwards to $s$.
+\item For every type $T$ named \id{} in $NS_n$, a corresponding getter named \id{} with return type \code{Type}, that, when invoked, returns the type object for $T$.
 \end{itemize}
 
 \LMHash{}
@@ -8964,7 +9358,7 @@
 Dart supports optional typing based on interface types.
 
 \rationale{
-The type system is unsound, due to the covariance of generic types.
+The type system is unsound, due to the covariance of generic classes.
 This is a deliberate choice (and undoubtedly controversial).
 Experience has shown that sound type rules for generics fly in the face of programmer intuition.
 It is easy for tools to provide a sound type analysis if they choose, which may be useful for tasks like refactoring.
@@ -9009,18 +9403,45 @@
 \LMHash{}
 A type $T$ is {\em malformed} if{}f:
 \begin{itemize}
-\item $T$ has the form $id$ or the form $prefix.id$, and in the enclosing lexical scope, the name $id$ (respectively $prefix.id$) does not denote a type.
-\item $T$ denotes a type variable in the enclosing lexical scope, but occurs in the signature or body of a static member.
-\item $T$ is a parameterized type of the form \code{$G$<$S_1, \ldots,\ S_n$>}, and $G$ is malformed.
-\item $T$ denotes declarations that were imported from multiple imports clauses.
-%Either $G$ or $S_i, i \in 1 .. n$ are malformed.
-% \item $G$ is not a generic type with $n$ type parameters.
-% \item Let $T_i$ be the type parameters of $G$ (if any) and let $B_i$ be the bound of $T_i, i \in 1 .. n$, and $S_i$ is not a subtype of $[S_1/T_1, \ldots, S_n/T_n]B_i, i \in 1 .. n$.
-% \end{itemize}
+\item
+  $T$ has the form \id{} or the form \code{\metavar{prefix}.\id},
+  and in the enclosing lexical scope,
+  the name \id{} (respectively \code{\metavar{prefix}.\id}) does not denote a type.
+
+\item
+  $T$ denotes a type variable in the enclosing lexical scope,
+  but occurs in the signature or body of a static member.
+
+\item $T$ is a parameterized type of the form \code{$G$<$S_1, \ldots,\ S_n$>},
+  and $G$ is malformed,
+  or $G$ is not a generic type,
+  or $G$ is a generic type, but it declares $n'$ type parameters and $n' \not= n$,
+  or $S_j$ is malformed for some $j \in 1 .. n$.
+
+\item $T$ is a function type of the form
+
+  \code{$T_0$ \FUNCTION{}<$X_1\ \EXTENDS\ B_1, \ldots,\ X_m\ \EXTENDS\ B_m$>}
+
+  \code{\quad($T_1\ x_1, \ldots,\ T_k\ x_k,\ $[$T_{k+1}\ x_{k+1}, \ldots,\ T_n\ x_n$])}
+
+  \noindent
+  or of the form
+
+  \code{$T_0$ \FUNCTION{}<$X_1\ \EXTENDS\ B_1, \ldots,\ X_m\ \EXTENDS\ B_m$>}
+
+  \code{\quad($T_1\ x_1, \ldots,\ T_k\ x_k,\ $\{$T_{k+1}\ x_{k+1}, \ldots,\ T_n\ x_n$\})}
+
+  \noindent
+  where each $x_j$ which is not a named parameter may be omitted,
+  and $T_j$ is malformed for some $j \in 0 .. n$,
+  or $B_j$ is malformed for some $j \in 1 .. m$.
+
+\item
+  $T$ denotes declarations that were imported from multiple imports clauses.
 \end{itemize}
 
 \LMHash{}
- Any use of a malformed type gives rise to a static warning.
+Any use of a malformed type gives rise to a static warning.
 A malformed type is then interpreted as \DYNAMIC{} by the static type checker and the run-time system unless explicitly specified otherwise.
 
 \rationale{
@@ -9191,17 +9612,17 @@
 \LMHash{}
 The effect of a type alias of the form
 
-\code{\TYPEDEF{} $T$ $id$($T_1\ p_1, \ldots,\ T_n\ p_n,\ [T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k}\ p_{n+k}]$)}
+\code{\TYPEDEF{} $T$ \id($T_1\ p_1, \ldots,\ T_n\ p_n,\ [T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k}\ p_{n+k}]$)}
 
 \noindent
-declared in a library $L$ is to introduce the name $id$ into the scope of $L$, bound to the function type
+declared in a library $L$ is to introduce the name \id{} into the scope of $L$, bound to the function type
 $(T_1, \ldots,\ T_n, [T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k} p_{n+k}]) \rightarrow T$.
 The effect of a type alias of the form
 
-\code{\TYPEDEF{} $T$ $id$($T_1\ p_1, \ldots,\ T_n\ p_n,\ \{T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k}\ p_{n+k}\}$)}
+\code{\TYPEDEF{} $T$ \id($T_1\ p_1, \ldots,\ T_n\ p_n,\ \{T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k}\ p_{n+k}\}$)}
 
 \noindent
-declared in a library $L$ is to introduce the name $id$ into the scope of $L$, bound to the function type
+declared in a library $L$ is to introduce the name \id{} into the scope of $L$, bound to the function type
 $(T_1, \ldots,\ T_n, \{T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k}\ p_{n+k}\}) \rightarrow T$.
 In either case, if{}f no return type is specified, it is taken to be \DYNAMIC{}.
 Likewise, if a type annotation is omitted on a formal parameter, it is taken to be \DYNAMIC{}.
@@ -9679,60 +10100,38 @@
 
 \LMHash{}
 Let $T$ be a parameterized type \code{$G$<$S_1, \ldots,\ S_n$>}.
-It is evaluated as follows.
+Assume that $T$ is not malformed.
 
-\LMHash{}
-If $G$ is not a generic type,
-the type arguments $S_i, i \in 1 .. n$ are ignored.
-If $G$ has $m \ne n$ type parameters, $T$ is treated as a parameterized type with $m$ arguments,
-all of which are \DYNAMIC{},
-and $S_i, i \in 1 .. n$ are ignored.
-
-%% TODO[dart-2]: This commentary should be completely obsolete in Dart 2.
 \commentary{
-In short, any arity mismatch results in all type arguments being dropped, and replaced by the correct number of type arguments, all set to \DYNAMIC{}.
-Of course, a static warning will be issued.
+In particular, $G$ denotes a generic type with $n$ formal type parameters.
 }
 
 \LMHash{}
-Otherwise, let $X_i$ be the type parameters of $G$ and let $B_i$ be the bound of $X_i, i \in 1 .. n$.
-Let $t_i$ be the result of evaluating $S_i$, for $i \in 1 .. n$.
-
-\LMHash{}
-$T$ is {\em malbounded} if{}f either $S_i$ is malbounded or $t_i$ is not a subtype of
-$[t_1/X_1, \ldots, t_n/X_n]B_i$,
-for one or more $i \in 1 .. n$.
-
-% TODO(eernst): When changing from warnings to errors, include the following
-% as a commentary:
-%
-%   We do not specify the result of evaluating a malbounded type.
-%   This is because it is a compile-time error when a parameterized type is
-%   encountered, unless it is statically known that it will not be malbounded.
-%
-% That is also the reason why we say "$S_i$ is malbounded", not "$t_i$" above.
-
-\LMHash{}
-Otherwise, $T$ evaluates to the generic instantiation where $G$ is applied to $t_1, \ldots, t_n$.
-
-\commentary{
-Note, that, in checked mode, it is a dynamic type error if a malbounded type is used in a type test as specified in \ref{dynamicTypeSystem}.
-}
+$T$ is {\em malbounded} if{}f either
+$S_i$ is malbounded for one or more $i \in 1 .. n$,
+or $T$ is not well-bounded (\ref{superBoundedTypes}).
 
 \LMHash{}
 Any use of a malbounded type gives rise to a static warning.
 
 \LMHash{}
-If $S$ is the static type of a member $m$ of $G$,
-then the static type of the member $m$ of
+Let $T$ be a parameterized type of the form
 \code{$G$<$A_1, \ldots,\ A_n$>}
-is
+and assume that $T$ is not malformed and not malbounded.
+If $S$ is the static type of a member $m$ declared by $G$,
+then the static type of the member $m$ of an expression of type $T$ is
 $[A_1/X_1, \ldots, A_n/X_n]S$,
 where $X_1, \ldots, X_n$ are the formal type parameters of $G$.
-Let $B_i$ be the bounds of $X_i, i \in 1 .. n$.
-It is a static type warning if $A_i$ is not a subtype of
-$[A_1/X_1, \ldots, A_n/X_n]B_i, i \in 1 .. n$.
-It is a static type warning if $G$ is not a generic type with exactly $n$ type parameters.
+
+\LMHash{}
+Let $T$ be a parameterized type of the form
+\code{$G$<$A_1, \ldots,\ A_n$>}
+and assume that $T$ is not malformed and not malbounded.
+$T$ is then evaluated as follows:
+
+\LMHash{}
+For $j \in 1 .. n$, evaluate $A_j$ to a type $t_j$.
+$T$ then evaluates to the generic instantiation where $G$ is applied to $t_1, \ldots, t_n$.
 
 
 \subsubsection{Actual Type of Declaration}
@@ -9741,7 +10140,7 @@
 % NOTE(eernst): The actual type arguments in this section are dynamic entities,
 % not syntax (the concept of an 'actual type' and an 'actual bound' is used to
 % specify the dynamic semantics, including dynamic errors). So we use $t_i$
-% to denote these type arguments, just like all those location where the
+% to denote these type arguments, just like all those locations where the
 % concept is used, rather than $A_i$ which is frequently used to denote the
 % syntax of an actual type argument.
 %
@@ -9775,7 +10174,7 @@
 Let \code{$X$ \EXTENDS{} $B$} be a formal type parameter declaration.
 Let
 $X_1, \ldots, X_n$
-be the formal type parameters in scope the declaration of $X$.
+be the formal type parameters in scope at the declaration of $X$.
 In a context where the actual type arguments corresponding to
 $X_1, \ldots, X_n$
 are
@@ -9789,7 +10188,6 @@
 }
 
 
-
 \subsubsection{Least Upper Bounds}
 \LMLabel{leastUpperBounds}
 
diff --git a/docs/language/informal/covariant-from-class.md b/docs/language/informal/covariant-from-class.md
index 0b66edf..2cdb696 100644
--- a/docs/language/informal/covariant-from-class.md
+++ b/docs/language/informal/covariant-from-class.md
@@ -4,7 +4,7 @@
 
 **Status**: Implemented.
 
-**Version**: 0.5 (2018-02-01)
+**Version**: 0.6 (2018-06-01)
 
 
 ## Summary
@@ -258,55 +258,9 @@
 may be different) which contains the built-in identifier `covariant`.*
 
 *We need to introduce a new kind of covariant parameters, in addition to the
-ones that are covariant by modifier.  To do that, we also need to define the
-variance of each occurrence of a type variable in a type, which determines how
-variations of the value of that type variable affect the overall type in a
-specific direction. There are three kinds: covariant, contravariant, and
-invariant occurrences.*
-
-We say that a type variable _X_ _occurs covariantly_ in a type _T_ if:
-
--   _T_ is _X_.
--   _T_ is a parameterized type _G<S<sub>0</sub> ..., S<sub>n</sub>>_, and
-    there is a _j_ such that _X_ occurs covariantly in _S<sub>j</sub>_.
--   _T_ is a function type and _X_ occurs covariantly in the return type of
-    _T_, or _X_ occurs contravariantly in a parameter type of _T_.
-
-We say that a type variable _X_ _occurs contravariantly_ in a type _T_ if:
-
--   _T_ is a parameterized type _G<S<sub>0</sub>, ..., S<sub>n</sub>>_, and
-    there is a _j_ such that _X_ occurs contravariantly in _S<sub>j</sub>_.
--   _T_ is a function type and _X_ occurs contravariantly in the return
-    type of _T_, or _X_ occurs covariantly in a parameter type of _T_.
-
-We say that a type variable _X_ _occurs invariantly_ in a type _T_ if:
-
--   _T_ is a parameterized type _G<S<sub>0</sub> ..., S<sub>n</sub>>_, and
-    there is a _j_ such that _X_ occurs invariantly in _S<sub>j</sub>_.
--   _T_ is a function type, and _X_ occurs invariantly in the return type
-    or a parameter type of _T_, or _X_ occurs anywhere in the bound of a
-    formal type parameter of _T_.
-
-*Note that the notion of occurring invariantly differs from that of many
-other languages, where it simply means occurring covariantly as well as
-contravariantly somewhere in the same type. In Dart, a type variable occurs
-invariantly if and only if it occurs in the bound of a formal type
-parameter of a function type, anywhere in the given type. The situation
-where a given type variable occurs both covariantly and contravariantly
-differs from this situation, and there is no separate name for that in
-Dart; if it is of interest it must be spelled out as we just did here.*
-
-*As mentioned, variance gives a characterization of the way a type varies
-as the value of a type variable therein varies: Assume that _T_ is a type
-where a type variable _X_ occurs, and and _L_ and _U_ are types such that
-_L <: U_. If _X_ occurs covariantly in _T_, but not contravariantly and not
-invariantly, then _[L/X]T <: [U/X]T_. Similarly, if _X_ occurs
-contravariantly in _T_, but not covariantly and not invariantly, then 
-_[U/X]T <: [L/X]T_. If _X_ occurs both covariantly and contravariantly, or
-it occurs invariantly (at all), then _[L/X]T_ and _[U/X]T_ are not
-guaranteed to be subtypes of each other in any direction. In short: with
-covariance, the type covaries; with contravariance, the type contravaries;
-with invariance, all bets are off.*
+ones that are covariant by modifier. To do that, we also need to refer to
+the variance of each occurrence of a type variable in a type, which is
+specified in the language specification.*
 
 Consider a class _T_ which is generic or has a generic supertype (directly
 or indirectly). Let _S_ be said generic class. Assume that there is a
@@ -512,6 +466,11 @@
 
 ## Updates
 
+*   Jun 1st 2018, version 0.6: Removed specification of variance, for which
+    the normative text is now part of the language specification. Adjusted
+    the wording to fit the slightly different definitions of variance given
+    there. The meaning of this feature specification has not changed.
+
 *   Feb 1st 2018, version 0.5: Added specification of override checks for
     parameters which are covariant from class.
 
diff --git a/docs/language/informal/generic-method-syntax.md b/docs/language/informal/generic-method-syntax.md
index f7ddc3e..b2b20a2 100644
--- a/docs/language/informal/generic-method-syntax.md
+++ b/docs/language/informal/generic-method-syntax.md
@@ -2,10 +2,9 @@
 
 **Author**: eernst@
 
-**Status**: Integrated into (and subsumed by) updates to the language
-specification as of
+**Status**: Background material.
+The normative text on this topic is part of the language specification as of
 [`673d5f0`](https://github.com/dart-lang/sdk/commit/673d5f0a665085153d25f8c39495eacdb010ca64).
-This document is now background material.
 
 **This document** is an informal specification of the support in Dart 1.x
 for generic methods and functions which includes syntax and name
diff --git a/docs/language/informal/super-bounded-types.md b/docs/language/informal/super-bounded-types.md
index b7d19da..cfcb996 100644
--- a/docs/language/informal/super-bounded-types.md
+++ b/docs/language/informal/super-bounded-types.md
@@ -2,9 +2,10 @@
 
 **Author**: eernst@.
 
-**Version**: 0.6 (2018-05-25).
+**Version**: 0.7 (2018-06-01).
 
-**Status**: Under implementation.
+**Status**: Background material.
+The language specification has the normative text on this topic.
 
 **This document** is an informal specification of the support in Dart 2 for
 using certain generic types where the declared bounds are violated. The
@@ -580,6 +581,10 @@
 
 ## Updates
 
+*   Version 0.7 (2018-06-01), marked as background material: The normative
+    text on variance and on super-bounded types is now part of the language
+    specification.
+
 *   Version 0.6 (2018-05-25), added example showing why we must check the
     right hand side of type aliases.
 
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index 3e2656a..dd02b95 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -109,7 +109,7 @@
 <body>
 <h1>Analysis Server API Specification</h1>
 <h1 style="color:#999999">Version
-  1.20.3
+  1.20.4
 </h1>
 <p>
   This document contains a specification of the API provided by the
@@ -3309,7 +3309,7 @@
       An enumeration of the kinds of folding regions.
     </p>
     
-  <dl><dt class="value">ANNOTATIONS</dt><dt class="value">CLASS_BODY</dt><dt class="value">DIRECTIVES</dt><dt class="value">DOCUMENTATION_COMMENT</dt><dt class="value">FILE_HEADER</dt><dt class="value">FUNCTION_BODY</dt></dl></dd><dt class="typeDefinition"><a name="type_FoldingRegion">FoldingRegion: object</a></dt><dd>
+  <dl><dt class="value">ANNOTATIONS</dt><dt class="value">CLASS_BODY</dt><dt class="value">DIRECTIVES</dt><dt class="value">DOCUMENTATION_COMMENT</dt><dt class="value">FILE_HEADER</dt><dt class="value">FUNCTION_BODY</dt><dt class="value">INVOCATION</dt><dt class="value">LITERAL</dt></dl></dd><dt class="typeDefinition"><a name="type_FoldingRegion">FoldingRegion: object</a></dt><dd>
     <p>
       A description of a region that can be folded.
     </p>
diff --git a/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart b/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart
index e5b0f1f56..fc19967 100644
--- a/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart
+++ b/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart
@@ -52,6 +52,8 @@
 abstract class DartFixContributor implements FixContributor {
   @override
   Future<List<Fix>> computeFixes(FixContext context) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AnalysisDriver driver = context.analysisDriver;
     Source source = context.error.source;
     if (!AnalysisEngine.isDartFileName(source.fullName)) {
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index ded8e70..eb9db41 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -40,6 +40,7 @@
 import 'package:analysis_server/src/search/search_domain.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';
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analysis_server/src/services/search/search_engine_internal.dart';
 import 'package:analysis_server/src/utilities/null_string_sink.dart';
@@ -656,6 +657,25 @@
    * [offset] or the node does not have an element.
    */
   Future<Element> getElementAtOffset(String file, int offset) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
+    if (!priorityFiles.contains(file)) {
+      var driver = await getAnalysisDriver(file);
+      if (driver == null) {
+        return null;
+      }
+
+      var unitElementResult = await driver.getUnitElement(file);
+      if (unitElementResult == null) {
+        return null;
+      }
+
+      var element = findElementByNameOffset(unitElementResult.element, offset);
+      if (element != null) {
+        return element;
+      }
+    }
+
     AstNode node = await getNodeAtOffset(file, offset);
     return getElementOfNode(node);
   }
@@ -690,6 +710,8 @@
    * the [offset].
    */
   Future<AstNode> getNodeAtOffset(String file, int offset) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     nd.AnalysisResult result = await getAnalysisResult(file);
     CompilationUnit unit = result?.unit;
     if (unit != null) {
@@ -704,6 +726,8 @@
    * Dart file or cannot be resolved.
    */
   Future<CompilationUnit> getResolvedCompilationUnit(String path) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     nd.AnalysisResult result = await getAnalysisResult(path);
     return result?.unit;
   }
@@ -975,6 +999,8 @@
   }
 
   Future<Null> shutdown() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     running = false;
 
     await options.analytics
@@ -1116,6 +1142,8 @@
   }
 
   _scheduleAnalysisImplementedNotification() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     Set<String> files = analysisServices[AnalysisService.IMPLEMENTED];
     if (files != null) {
       scheduleImplementedNotification(this, files);
diff --git a/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart b/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
index 72e7cfb..8bdb5d5 100644
--- a/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
+++ b/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
@@ -50,6 +50,8 @@
 
   @override
   Future<Response> sendRequest(Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String id = request.id;
     output.write(json.encode(request.toJson()) + '\n');
     return await responseStream
diff --git a/pkg/analysis_server/lib/src/computer/computer_folding.dart b/pkg/analysis_server/lib/src/computer/computer_folding.dart
index ee82362..1a5a5c3 100644
--- a/pkg/analysis_server/lib/src/computer/computer_folding.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_folding.dart
@@ -158,24 +158,59 @@
   }
 
   @override
+  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    _computer._addRegion(node.argumentList.leftParenthesis.end,
+        node.argumentList.rightParenthesis.offset, FoldingKind.INVOCATION);
+    return super.visitFunctionExpressionInvocation(node);
+  }
+
+  @override
   visitImportDirective(ImportDirective node) {
     _computer._recordDirective(node);
     return super.visitImportDirective(node);
   }
 
   @override
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    _computer._addRegion(node.argumentList.leftParenthesis.end,
+        node.argumentList.rightParenthesis.offset, FoldingKind.INVOCATION);
+    return super.visitInstanceCreationExpression(node);
+  }
+
+  @override
   Object visitLibraryDirective(LibraryDirective node) {
     _computer._recordDirective(node);
     return super.visitLibraryDirective(node);
   }
 
   @override
+  Object visitListLiteral(ListLiteral node) {
+    _computer._addRegion(
+        node.leftBracket.end, node.rightBracket.offset, FoldingKind.LITERAL);
+    return super.visitListLiteral(node);
+  }
+
+  @override
+  Object visitMapLiteral(MapLiteral node) {
+    _computer._addRegion(
+        node.leftBracket.end, node.rightBracket.offset, FoldingKind.LITERAL);
+    return super.visitMapLiteral(node);
+  }
+
+  @override
   Object visitMethodDeclaration(MethodDeclaration node) {
     _computer._addRegionForAnnotations(node.metadata);
     return super.visitMethodDeclaration(node);
   }
 
   @override
+  Object visitMethodInvocation(MethodInvocation node) {
+    _computer._addRegion(node.argumentList.leftParenthesis.end,
+        node.argumentList.rightParenthesis.offset, FoldingKind.INVOCATION);
+    return super.visitMethodInvocation(node);
+  }
+
+  @override
   Object visitPartDirective(PartDirective node) {
     _computer._recordDirective(node);
     return super.visitPartDirective(node);
diff --git a/pkg/analysis_server/lib/src/computer/import_elements_computer.dart b/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
index c1be612..292b748 100644
--- a/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
+++ b/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
@@ -6,6 +6,7 @@
 
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/analysis/uri_converter.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/ast_factory.dart';
 import 'package:analyzer/dart/ast/token.dart';
@@ -50,10 +51,12 @@
    */
   Future<SourceChange> createEdits(
       List<ImportedElements> importedElementsList) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<ImportedElements> filteredImportedElements =
         _filterImportedElements(importedElementsList);
     LibraryElement libraryElement = libraryResult.libraryElement;
-    SourceFactory sourceFactory = libraryResult.session.sourceFactory;
+    UriConverter uriConverter = libraryResult.session.uriConverter;
     List<ImportDirective> existingImports = <ImportDirective>[];
     for (var directive in libraryResult.unit.directives) {
       if (directive is ImportDirective) {
@@ -73,7 +76,7 @@
           // so we need to add an import.
           //
           File importedFile = resourceProvider.getFile(importedElements.path);
-          Uri uri = sourceFactory.restoreUri(importedFile.createSource());
+          Uri uri = uriConverter.pathToUri(importedFile.path);
           Source importedSource = importedFile.createSource(uri);
           String importUri =
               _getLibrarySourceUri(libraryElement, importedSource);
diff --git a/pkg/analysis_server/lib/src/domain_abstract.dart b/pkg/analysis_server/lib/src/domain_abstract.dart
index 65a2dd4..3c01cbf 100644
--- a/pkg/analysis_server/lib/src/domain_abstract.dart
+++ b/pkg/analysis_server/lib/src/domain_abstract.dart
@@ -42,6 +42,8 @@
       Map<PluginInfo, Future<plugin.Response>> futures,
       {plugin.RequestParams requestParameters,
       int timeout: 500}) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // TODO(brianwilkerson) requestParameters might need to be required.
     int endTime = new DateTime.now().millisecondsSinceEpoch + timeout;
     List<plugin.Response> responses = <plugin.Response>[];
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index b586b41..a5d5199 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -45,6 +45,8 @@
    * Implement the `analysis.getErrors` request.
    */
   Future<Null> getErrors(Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String file = new AnalysisGetErrorsParams.fromRequest(request).file;
 
     void send(engine.AnalysisOptions analysisOptions, LineInfo lineInfo,
@@ -77,6 +79,8 @@
    * Implement the `analysis.getHover` request.
    */
   Future<Null> getHover(Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var params = new AnalysisGetHoverParams.fromRequest(request);
 
     // Prepare the resolved units.
@@ -102,6 +106,8 @@
    * Implement the `analysis.getImportedElements` request.
    */
   Future<Null> getImportedElements(Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AnalysisGetImportedElementsParams params =
         new AnalysisGetImportedElementsParams.fromRequest(request);
     //
@@ -158,6 +164,8 @@
    * Implement the `analysis.getNavigation` request.
    */
   Future<Null> getNavigation(Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var params = new AnalysisGetNavigationParams.fromRequest(request);
     String file = params.file;
     int offset = params.offset;
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index 97d4ec5..6a4a0ff 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -72,6 +72,8 @@
    */
   Future<CompletionResult> computeSuggestions(CompletionRequestImpl request,
       CompletionGetSuggestionsParams params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     //
     // Allow plugins to start computing fixes.
     //
@@ -166,6 +168,8 @@
    * Process a `completion.getSuggestions` request.
    */
   Future<Null> processRequest(Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     performance = new CompletionPerformance();
 
     // extract and validate params
diff --git a/pkg/analysis_server/lib/src/domain_diagnostic.dart b/pkg/analysis_server/lib/src/domain_diagnostic.dart
index 81bff6b..6c03067 100644
--- a/pkg/analysis_server/lib/src/domain_diagnostic.dart
+++ b/pkg/analysis_server/lib/src/domain_diagnostic.dart
@@ -38,6 +38,8 @@
 
   /// Answer the `diagnostic.getServerPort` request.
   Future handleGetServerPort(Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     try {
       // Open a port (or return the existing one).
       int port = await server.diagnosticServer.getServerPort();
diff --git a/pkg/analysis_server/lib/src/domain_execution.dart b/pkg/analysis_server/lib/src/domain_execution.dart
index 16c23fb..a1ed194 100644
--- a/pkg/analysis_server/lib/src/domain_execution.dart
+++ b/pkg/analysis_server/lib/src/domain_execution.dart
@@ -63,6 +63,8 @@
    * Implement the 'execution.getSuggestions' request.
    */
   void getSuggestions(Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var params = new ExecutionGetSuggestionsParams.fromRequest(request);
     var computer = new RuntimeCompletionComputer(
         server.resourceProvider,
diff --git a/pkg/analysis_server/lib/src/domain_kythe.dart b/pkg/analysis_server/lib/src/domain_kythe.dart
index 895bd82..2529bb1 100644
--- a/pkg/analysis_server/lib/src/domain_kythe.dart
+++ b/pkg/analysis_server/lib/src/domain_kythe.dart
@@ -35,6 +35,8 @@
    * Implement the `kythe.getKytheEntries` request.
    */
   Future<Null> getKytheEntries(Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String file = new KytheGetKytheEntriesParams.fromRequest(request).file;
     AnalysisDriver driver = server.getAnalysisDriver(file);
     if (driver == null) {
diff --git a/pkg/analysis_server/lib/src/domain_server.dart b/pkg/analysis_server/lib/src/domain_server.dart
index ccd12bc..1f205bb 100644
--- a/pkg/analysis_server/lib/src/domain_server.dart
+++ b/pkg/analysis_server/lib/src/domain_server.dart
@@ -67,6 +67,8 @@
    * Cleanly shutdown the analysis server.
    */
   Future<Null> shutdown(Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     await server.shutdown();
     Response response = new ServerShutdownResult().toResponse(request.id);
     server.sendResponse(response);
diff --git a/pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart b/pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart
index 54f9973..cff08c1 100644
--- a/pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart
+++ b/pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart
@@ -18,6 +18,8 @@
   ImplementedComputer(this.searchEngine, this.unitElement);
 
   compute() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     for (ClassElement type in unitElement.types) {
       // Always include Object and its members.
       if (type.supertype == null) {
diff --git a/pkg/analysis_server/lib/src/domains/execution/completion.dart b/pkg/analysis_server/lib/src/domains/execution/completion.dart
index 9a4e0b3..c3a218e 100644
--- a/pkg/analysis_server/lib/src/domains/execution/completion.dart
+++ b/pkg/analysis_server/lib/src/domains/execution/completion.dart
@@ -46,6 +46,8 @@
       this.expressions);
 
   Future<RuntimeCompletionResult> compute() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var contextResult = await analysisDriver.getResult(contextFile);
     var session = contextResult.session;
 
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 1fd145f..2857e67 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -148,6 +148,8 @@
   }
 
   Future getAssists(Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     EditGetAssistsParams params = new EditGetAssistsParams.fromRequest(request);
     String file = params.file;
     int offset = params.offset;
@@ -210,6 +212,8 @@
   }
 
   Future getFixes(Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     EditGetFixesParams params = new EditGetFixesParams.fromRequest(request);
     String file = params.file;
     int offset = params.offset;
@@ -257,6 +261,8 @@
   }
 
   Future getPostfixCompletion(Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     server.options.analytics?.sendEvent('edit', 'getPostfixCompletion');
 
     var params = new EditGetPostfixCompletionParams.fromRequest(request);
@@ -293,6 +299,8 @@
   }
 
   Future getStatementCompletion(Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var params = new EditGetStatementCompletionParams.fromRequest(request);
     SourceChange change;
 
@@ -373,6 +381,8 @@
    * Implement the `edit.importElements` request.
    */
   Future<Null> importElements(Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     EditImportElementsParams params =
         new EditImportElementsParams.fromRequest(request);
     //
@@ -406,6 +416,8 @@
   }
 
   Future isPostfixCompletionApplicable(Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var params = new EditGetPostfixCompletionParams.fromRequest(request);
     bool value = false;
 
@@ -436,6 +448,8 @@
   }
 
   Future listPostfixCompletionTemplates(Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var templates = DartPostfixCompletion.ALL_TEMPLATES
         .map((pfc) =>
             new PostfixTemplateDescriptor(pfc.name, pfc.key, pfc.example))
@@ -447,6 +461,8 @@
   }
 
   Future<Null> organizeDirectives(Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     server.options.analytics?.sendEvent('edit', 'organizeDirectives');
 
     var params = new EditOrganizeDirectivesParams.fromRequest(request);
@@ -482,6 +498,8 @@
   }
 
   Future<Null> sortMembers(Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var params = new EditSortMembersParams.fromRequest(request);
     // prepare file
     String file = params.file;
@@ -520,6 +538,8 @@
    */
   Future<List<AnalysisErrorFixes>> _computeServerErrorFixes(
       AnalysisDriver driver, String file, int offset) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<AnalysisErrorFixes> errorFixesList = <AnalysisErrorFixes>[];
     AnalysisResult result = await server.getAnalysisResult(file);
     if (result != null) {
@@ -562,6 +582,8 @@
   }
 
   Future _getAvailableRefactoringsImpl(Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // prepare parameters
     var params = new EditGetAvailableRefactoringsParams.fromRequest(request);
     String file = params.file;
@@ -786,6 +808,8 @@
     }
 
     runZoned(() async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       await _init(params.kind, params.file, params.offset, params.length);
       if (initStatus.hasFatalError) {
         feedback = null;
@@ -876,6 +900,8 @@
    */
   Future _init(
       RefactoringKind kind, String file, int offset, int length) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // check if we can continue with the existing Refactoring instance
     if (this.kind == kind &&
         this.file == file &&
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_correction.dart b/pkg/analysis_server/lib/src/flutter/flutter_correction.dart
index 3791140..459baf7 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_correction.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_correction.dart
@@ -53,6 +53,8 @@
   String get eol => utils.endOfLine;
 
   Future<SourceChange> addForDesignTimeConstructor() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     final node = this.node;
     if (node is ClassDeclaration) {
       var className = node.name.name;
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_domain.dart b/pkg/analysis_server/lib/src/flutter/flutter_domain.dart
index 5c5470a3..45698c4 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_domain.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_domain.dart
@@ -21,6 +21,39 @@
    */
   FlutterDomainHandler(AnalysisServer server) : super(server);
 
+  /**
+   * Implement the 'flutter.getChangeAddForDesignTimeConstructor' request.
+   */
+  Future getChangeAddForDesignTimeConstructor(Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
+    var params =
+        new FlutterGetChangeAddForDesignTimeConstructorParams.fromRequest(
+            request);
+    String file = params.file;
+    int offset = params.offset;
+
+    ResolveResult result = await server.getAnalysisResult(file);
+    if (result != null) {
+      var corrections = new FlutterCorrections(
+          file: file,
+          fileContent: result.content,
+          selectionOffset: offset,
+          selectionLength: 0,
+          session: result.session,
+          unit: result.unit);
+      SourceChange change = await corrections.addForDesignTimeConstructor();
+      if (change != null) {
+        server.sendResponse(
+            new FlutterGetChangeAddForDesignTimeConstructorResult(change)
+                .toResponse(request.id));
+        return;
+      }
+    }
+    server.sendResponse(
+        new Response.invalidParameter(request, 'file', 'No change'));
+  }
+
   @override
   Response handleRequest(Request request) {
     try {
@@ -49,35 +82,4 @@
     server.setFlutterSubscriptions(subMap);
     return new FlutterSetSubscriptionsResult().toResponse(request.id);
   }
-
-  /**
-   * Implement the 'flutter.getChangeAddForDesignTimeConstructor' request.
-   */
-  Future getChangeAddForDesignTimeConstructor(Request request) async {
-    var params =
-        new FlutterGetChangeAddForDesignTimeConstructorParams.fromRequest(
-            request);
-    String file = params.file;
-    int offset = params.offset;
-
-    ResolveResult result = await server.getAnalysisResult(file);
-    if (result != null) {
-      var corrections = new FlutterCorrections(
-          file: file,
-          fileContent: result.content,
-          selectionOffset: offset,
-          selectionLength: 0,
-          session: result.session,
-          unit: result.unit);
-      SourceChange change = await corrections.addForDesignTimeConstructor();
-      if (change != null) {
-        server.sendResponse(
-            new FlutterGetChangeAddForDesignTimeConstructorResult(change)
-                .toResponse(request.id));
-        return;
-      }
-    }
-    server.sendResponse(
-        new Response.invalidParameter(request, 'file', 'No change'));
-  }
 }
diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index 24a4811..1ec5d31 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -20,6 +20,8 @@
 
 Future<Null> scheduleImplementedNotification(
     AnalysisServer server, Iterable<String> files) async {
+  // TODO(brianwilkerson) Determine whether this await is necessary.
+  await null;
   SearchEngine searchEngine = server.searchEngine;
   if (searchEngine == null) {
     return;
@@ -81,15 +83,6 @@
   });
 }
 
-void sendAnalysisNotificationFolding(AnalysisServer server, String file,
-    LineInfo lineInfo, CompilationUnit dartUnit) {
-  _sendNotification(server, () {
-    var regions = new DartUnitFoldingComputer(lineInfo, dartUnit).compute();
-    var params = new protocol.AnalysisFoldingParams(file, regions);
-    server.sendNotification(params.toNotification());
-  });
-}
-
 void sendAnalysisNotificationFlushResults(
     AnalysisServer server, List<String> files) {
   _sendNotification(server, () {
@@ -100,6 +93,15 @@
   });
 }
 
+void sendAnalysisNotificationFolding(AnalysisServer server, String file,
+    LineInfo lineInfo, CompilationUnit dartUnit) {
+  _sendNotification(server, () {
+    var regions = new DartUnitFoldingComputer(lineInfo, dartUnit).compute();
+    var params = new protocol.AnalysisFoldingParams(file, regions);
+    server.sendNotification(params.toNotification());
+  });
+}
+
 void sendAnalysisNotificationHighlights(
     AnalysisServer server, String file, CompilationUnit dartUnit) {
   _sendNotification(server, () {
diff --git a/pkg/analysis_server/lib/src/plugin/plugin_manager.dart b/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
index 4686b23..13e4b5f 100644
--- a/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
+++ b/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
@@ -246,6 +246,8 @@
    * used to interact with the plugin, or `null` if the plugin could not be run.
    */
   Future<PluginSession> start(String byteStorePath, String sdkPath) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (currentSession != null) {
       throw new StateError('Cannot start a plugin that is already running.');
     }
@@ -378,6 +380,8 @@
    */
   Future<Null> addPluginToContextRoot(
       analyzer.ContextRoot contextRoot, String path) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     PluginInfo plugin = _pluginMap[path];
     bool isNew = plugin == null;
     if (isNew) {
@@ -447,6 +451,8 @@
    */
   Future<List<Future<Response>>> broadcastWatchEvent(
       watcher.WatchEvent watchEvent) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String filePath = watchEvent.path;
 
     /**
@@ -572,6 +578,8 @@
    * Restart all currently running plugins.
    */
   Future<Null> restartPlugins() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     for (PluginInfo plugin in _pluginMap.values.toList()) {
       if (plugin.currentSession != null) {
         //
@@ -1044,6 +1052,8 @@
    * running.
    */
   Future<bool> start(String byteStorePath, String sdkPath) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (channel != null) {
       throw new StateError('Cannot start a plugin that is already running.');
     }
diff --git a/pkg/analysis_server/lib/src/search/element_references.dart b/pkg/analysis_server/lib/src/search/element_references.dart
index fc60fb9..79f3714f 100644
--- a/pkg/analysis_server/lib/src/search/element_references.dart
+++ b/pkg/analysis_server/lib/src/search/element_references.dart
@@ -23,6 +23,8 @@
    */
   Future<List<SearchResult>> compute(
       Element element, bool withPotential) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<SearchResult> results = <SearchResult>[];
 
     // Add element references.
@@ -45,6 +47,8 @@
    * to the corresponding hierarchy [Element]s.
    */
   Future<List<SearchResult>> _findElementsReferences(Element element) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<SearchResult> allResults = <SearchResult>[];
     Iterable<Element> refElements = await _getRefElements(element);
     for (Element refElement in refElements) {
@@ -60,6 +64,8 @@
    */
   Future<List<SearchResult>> _findSingleElementReferences(
       Element element) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<SearchMatch> matches = await searchEngine.searchReferences(element);
     matches = SearchMatch.withNotNullElement(matches);
     return matches.map(toResult).toList();
diff --git a/pkg/analysis_server/lib/src/search/search_domain.dart b/pkg/analysis_server/lib/src/search/search_domain.dart
index ab94d11..805344d 100644
--- a/pkg/analysis_server/lib/src/search/search_domain.dart
+++ b/pkg/analysis_server/lib/src/search/search_domain.dart
@@ -42,6 +42,8 @@
         searchEngine = server.searchEngine;
 
   Future findElementReferences(protocol.Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var params =
         new protocol.SearchFindElementReferencesParams.fromRequest(request);
     String file = params.file;
@@ -74,6 +76,8 @@
   }
 
   Future findMemberDeclarations(protocol.Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var params =
         new protocol.SearchFindMemberDeclarationsParams.fromRequest(request);
     await server.onAnalysisComplete;
@@ -89,6 +93,8 @@
   }
 
   Future findMemberReferences(protocol.Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var params =
         new protocol.SearchFindMemberReferencesParams.fromRequest(request);
     await server.onAnalysisComplete;
@@ -104,6 +110,8 @@
   }
 
   Future findTopLevelDeclarations(protocol.Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var params =
         new protocol.SearchFindTopLevelDeclarationsParams.fromRequest(request);
     try {
@@ -131,6 +139,8 @@
    * Implement the `search.getDeclarations` request.
    */
   Future getDeclarations(protocol.Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var params =
         new protocol.SearchGetElementDeclarationsParams.fromRequest(request);
 
@@ -218,6 +228,8 @@
    * Implement the `search.getTypeHierarchy` request.
    */
   Future getTypeHierarchy(protocol.Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var params = new protocol.SearchGetTypeHierarchyParams.fromRequest(request);
     String file = params.file;
     // prepare element
diff --git a/pkg/analysis_server/lib/src/search/type_hierarchy.dart b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
index 841e291..40b71ad 100644
--- a/pkg/analysis_server/lib/src/search/type_hierarchy.dart
+++ b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
@@ -52,6 +52,8 @@
    * Returns the computed type hierarchy, maybe `null`.
    */
   Future<List<TypeHierarchyItem>> compute() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (_pivotClass != null) {
       InterfaceType type = _pivotClass.type;
       _createSuperItem(type);
@@ -75,6 +77,8 @@
 
   Future _createSubclasses(
       TypeHierarchyItem item, int itemId, InterfaceType type) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     Set<ClassElement> subElements =
         await getDirectSubClasses(_searchEngine, type.element);
     List<int> subItemIds = <int>[];
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index ac0d78b..af6e262 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -433,6 +433,8 @@
 
     _captureExceptions(instrumentationService, () {
       stdioServer.serveStdio().then((_) async {
+        // TODO(brianwilkerson) Determine whether this await is necessary.
+        await null;
         if (serve_http) {
           httpServer.close();
         }
diff --git a/pkg/analysis_server/lib/src/server/http_server.dart b/pkg/analysis_server/lib/src/server/http_server.dart
index bcbf428..6acfe4e 100644
--- a/pkg/analysis_server/lib/src/server/http_server.dart
+++ b/pkg/analysis_server/lib/src/server/http_server.dart
@@ -78,7 +78,11 @@
   /**
    * Return the port this server is bound to.
    */
-  Future<int> get boundPort async => (await _serverFuture)?.port;
+  Future<int> get boundPort async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
+    return (await _serverFuture)?.port;
+  }
 
   void close() {
     _serverFuture?.then((HttpServer server) {
@@ -101,6 +105,8 @@
    * Begin serving HTTP requests over the given port.
    */
   Future<int> serveHttp([int initialPort]) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (_serverFuture != null) {
       return boundPort;
     }
@@ -125,6 +131,8 @@
    * Handle a GET request received by the HTTP server.
    */
   Future<Null> _handleGetRequest(HttpRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (getHandler == null) {
       getHandler = new DiagnosticsSite(socketServer, _printBuffer);
     }
@@ -136,6 +144,8 @@
    */
   void _handleServer(HttpServer httpServer) {
     httpServer.listen((HttpRequest request) async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       List<String> updateValues = request.headers[HttpHeaders.UPGRADE];
       if (request.method == 'GET') {
         await _handleGetRequest(request);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
index 1291f78..005cc23 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
@@ -179,6 +179,8 @@
   @override
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     this.request = request;
     this.suggestions = <CompletionSuggestion>[];
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
index 2914658..3481a82 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
@@ -19,6 +19,8 @@
   @override
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AstNode node = request.target.containingNode;
     if (node is! Combinator) {
       return EMPTY_LIST;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
index 22062cc5..275fbd2 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
@@ -56,6 +56,8 @@
   @override
   Future<List<CompletionSuggestion>> computeSuggestions(
       CompletionRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     request.checkAborted();
     if (!AnalysisEngine.isDartFileName(request.result.path)) {
       return EMPTY_LIST;
@@ -292,6 +294,8 @@
    */
   static Future<DartCompletionRequest> from(CompletionRequest request,
       {ResultDescriptor resultDescriptor}) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     request.checkAborted();
     CompletionPerformance performance =
         (request as CompletionRequestImpl).performance;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart
index 94f4318..c3db2af 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart
@@ -18,6 +18,8 @@
   @override
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AstNode node = request.target.containingNode;
     if (node is! FieldFormalParameter) {
       return EMPTY_LIST;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart
index e182fdf..9c2a7e8 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart
@@ -41,6 +41,8 @@
   @override
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (!request.includeIdentifiers) {
       return EMPTY_LIST;
     }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart
index 63d624c..95d2650 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart
@@ -57,6 +57,8 @@
   @override
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (!request.includeIdentifiers) {
       return EMPTY_LIST;
     }
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 baef690..a2ceffb 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
@@ -30,6 +30,8 @@
   @override
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<CompletionSuggestion> suggestions = <CompletionSuggestion>[];
 
     // Don't suggest anything right after double or integer literals.
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart
index 1e8c520..4dead0e 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart
@@ -24,6 +24,8 @@
   @override
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     OpType optype = (request as DartCompletionRequestImpl).opType;
 
     // Collect suggestions from the specific child [AstNode] that contains
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
index b7afbbe..a9c9afc 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
@@ -20,6 +20,8 @@
   @override
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // Determine if the target looks like a library prefix
     Expression targetId = request.dotTarget;
     if (targetId is SimpleIdentifier && !request.target.isCascade) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart
index 9ba62c4..537b7bf 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart
@@ -19,6 +19,8 @@
   @override
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (!request.includeIdentifiers) {
       return EMPTY_LIST;
     }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_constructor_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_constructor_contributor.dart
index ec71bf9..d81e161 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_constructor_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_constructor_contributor.dart
@@ -28,6 +28,8 @@
   @override
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     OpType optype = (request as DartCompletionRequestImpl).opType;
 
     // Collect suggestions from the specific child [AstNode] that contains
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
index d22c4f5..2098f24 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
@@ -192,6 +192,8 @@
   @override
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (!request.includeIdentifiers) {
       return EMPTY_LIST;
     }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
index 0205b18..f179469 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
@@ -31,6 +31,8 @@
   @override
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     OpType optype = (request as DartCompletionRequestImpl).opType;
     AstNode node = request.target.containingNode;
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
index 5874ac5..0a80399 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
@@ -19,6 +19,8 @@
   @override
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AstNode node = request.target.containingNode;
     LibraryElement libElem = request.libraryElement;
     if (libElem == null) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
index e31866b..d435a04 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
@@ -27,6 +27,8 @@
   @override
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     SimpleIdentifier targetId = _getTargetId(request.target);
     if (targetId == null) {
       return EMPTY_LIST;
@@ -69,6 +71,8 @@
       SimpleIdentifier targetId,
       ExecutableElement element,
       StringBuffer displayTextBuffer) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     DartChangeBuilder builder =
         new DartChangeBuilder(result.driver.currentSession);
     await builder.addFileEdit(result.path, (DartFileEditBuilder builder) {
@@ -86,6 +90,8 @@
    */
   Future<CompletionSuggestion> _buildSuggestion(DartCompletionRequest request,
       SimpleIdentifier targetId, ExecutableElement element) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     StringBuffer displayTextBuffer = new StringBuffer();
     DartChangeBuilder builder = await _buildReplacementText(
         request.result, targetId, element, displayTextBuffer);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
index 593de24..d06eab9 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
@@ -20,6 +20,8 @@
   @override
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     Expression targetId = request.dotTarget;
     if (targetId is Identifier && !request.target.isCascade) {
       Element elem = targetId.bestElement;
@@ -63,11 +65,6 @@
   }
 
   @override
-  visitElement(Element element) {
-    // ignored
-  }
-
-  @override
   visitConstructorElement(ConstructorElement element) {
     if (element.context.analysisOptions.previewDart2) {
       _addSuggestion(element);
@@ -75,6 +72,11 @@
   }
 
   @override
+  visitElement(Element element) {
+    // ignored
+  }
+
+  @override
   visitFieldElement(FieldElement element) {
     if (element.isStatic) {
       _addSuggestion(element);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
index e49bdab..d1acf19 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
@@ -22,6 +22,8 @@
   @override
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     LibraryElement containingLibrary = request.libraryElement;
     // Gracefully degrade if the library element is not resolved
     // e.g. detached part file or source change
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
index de77d4c..6226346 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
@@ -20,8 +20,6 @@
  * A contributor for calculating uri suggestions for import and part directives.
  */
 class UriContributor extends DartCompletionContributor {
-  _UriSuggestionBuilder builder;
-
   /**
    * A flag indicating whether file: and package: URI suggestions should
    * be included in the list of completion suggestions.
@@ -31,9 +29,13 @@
   // to only those paths within context roots.
   static bool suggestFilePaths = true;
 
+  _UriSuggestionBuilder builder;
+
   @override
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     builder = new _UriSuggestionBuilder(request);
     request.target.containingNode.accept(builder);
     return builder.suggestions;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
index 92a8389..44790b9 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
@@ -40,6 +40,8 @@
   @override
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     OpType optype = (request as DartCompletionRequestImpl).opType;
 
     // Collect suggestions from the specific child [AstNode] that contains
diff --git a/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart b/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
index 704ffdb..32f0504 100644
--- a/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
@@ -76,6 +76,8 @@
 
   static Future<PostfixCompletion> expandAssert(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return processor.expand(kind, processor.findAssertExpression, (expr) {
       return "assert(${processor.utils.getNodeText(expr)});";
     }, withBraces: false);
@@ -83,12 +85,16 @@
 
   static Future<PostfixCompletion> expandElse(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return processor.expand(kind, processor.findBoolExpression,
         (expr) => "if (${processor.makeNegatedBoolExpr(expr)})");
   }
 
   static Future<PostfixCompletion> expandFor(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return processor.expand(kind, processor.findIterableExpression, (expr) {
       String value = processor.newVariable("value");
       return "for (var $value in ${processor.utils.getNodeText(expr)})";
@@ -97,6 +103,8 @@
 
   static Future<PostfixCompletion> expandFori(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return processor.expand(kind, processor.findIntExpression, (expr) {
       String index = processor.newVariable("i");
       return "for (int $index = 0; $index < ${processor.utils.getNodeText(
@@ -106,12 +114,16 @@
 
   static Future<PostfixCompletion> expandIf(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return processor.expand(kind, processor.findBoolExpression,
         (expr) => "if (${processor.utils.getNodeText(expr)})");
   }
 
   static Future<PostfixCompletion> expandNegate(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return processor.expand(kind, processor.findBoolExpression,
         (expr) => processor.makeNegatedBoolExpr(expr),
         withBraces: false);
@@ -119,6 +131,8 @@
 
   static Future<PostfixCompletion> expandNotNull(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return processor.expand(kind, processor.findObjectExpression, (expr) {
       return expr is NullLiteral
           ? "if (false)"
@@ -128,6 +142,8 @@
 
   static Future<PostfixCompletion> expandNull(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return processor.expand(kind, processor.findObjectExpression, (expr) {
       return expr is NullLiteral
           ? "if (true)"
@@ -137,6 +153,8 @@
 
   static Future<PostfixCompletion> expandParen(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return processor.expand(kind, processor.findObjectExpression,
         (expr) => "(${processor.utils.getNodeText(expr)})",
         withBraces: false);
@@ -144,6 +162,8 @@
 
   static Future<PostfixCompletion> expandReturn(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return processor.expand(kind, processor.findObjectExpression,
         (expr) => "return ${processor.utils.getNodeText(expr)};",
         withBraces: false);
@@ -151,22 +171,30 @@
 
   static Future<PostfixCompletion> expandSwitch(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return processor.expand(kind, processor.findObjectExpression,
         (expr) => "switch (${processor.utils.getNodeText(expr)})");
   }
 
   static Future<PostfixCompletion> expandTry(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return processor.expandTry(kind, processor.findStatement, withOn: false);
   }
 
   static Future<PostfixCompletion> expandTryon(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return processor.expandTry(kind, processor.findStatement, withOn: true);
   }
 
   static Future<PostfixCompletion> expandWhile(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return processor.expand(kind, processor.findBoolExpression,
         (expr) => "while (${processor.utils.getNodeText(expr)})");
   }
@@ -320,6 +348,8 @@
   CompilationUnitElement get unitElement => completionContext.unitElement;
 
   Future<PostfixCompletion> compute() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     node = _selectedNode();
     if (node == null) {
       return NO_COMPLETION;
@@ -331,6 +361,8 @@
   Future<PostfixCompletion> expand(
       PostfixCompletionKind kind, Function contexter, Function sourcer,
       {bool withBraces: true}) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AstNode expr = contexter();
     if (expr == null) {
       return null;
@@ -366,6 +398,8 @@
   Future<PostfixCompletion> expandTry(
       PostfixCompletionKind kind, Function contexter,
       {bool withOn: false}) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AstNode stmt = contexter();
     if (stmt == null) {
       return null;
@@ -470,6 +504,8 @@
   }
 
   Future<bool> isApplicable() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     node = _selectedNode();
     if (node == null) {
       return false;
diff --git a/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart b/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
index 3c7bdd83..029ed3f 100644
--- a/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
@@ -162,6 +162,8 @@
   CompilationUnitElement get unitElement => statementContext.unitElement;
 
   Future<StatementCompletion> compute() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     node = _selectedNode();
     if (node == null) {
       return NO_COMPLETION;
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index 8497b25..8fd931b 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -110,6 +110,8 @@
   }
 
   Future<List<Assist>> compute() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     try {
       utils = new CorrectionUtils(unit);
     } catch (e) {
@@ -219,6 +221,8 @@
   }
 
   Future<Null> _addProposal_addTypeAnnotation_DeclaredIdentifier() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     DeclaredIdentifier declaredIdentifier =
         node.getAncestor((n) => n is DeclaredIdentifier);
     if (declaredIdentifier == null) {
@@ -268,6 +272,8 @@
   }
 
   Future<Null> _addProposal_addTypeAnnotation_SimpleFormalParameter() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AstNode node = this.node;
     // should be the name of a simple parameter
     if (node is! SimpleIdentifier || node.parent is! SimpleFormalParameter) {
@@ -308,6 +314,8 @@
   }
 
   Future<Null> _addProposal_addTypeAnnotation_VariableDeclaration() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AstNode node = this.node;
     // prepare VariableDeclarationList
     VariableDeclarationList declarationList =
@@ -369,6 +377,8 @@
   }
 
   Future<Null> _addProposal_assignToLocalVariable() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // prepare enclosing ExpressionStatement
     ExpressionStatement expressionStatement;
     for (AstNode node = this.node; node != null; node = node.parent) {
@@ -422,6 +432,8 @@
   }
 
   Future<Null> _addProposal_convertDocumentationIntoBlock() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     Comment comment = node.getAncestor((n) => n is Comment);
     if (comment == null || !comment.isDocumentation) {
       return;
@@ -453,6 +465,8 @@
   }
 
   Future<Null> _addProposal_convertDocumentationIntoLine() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     Comment comment = node.getAncestor((n) => n is Comment);
     if (comment == null ||
         !comment.isDocumentation ||
@@ -512,6 +526,8 @@
   }
 
   Future<Null> _addProposal_convertIntoFinalField() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // Find the enclosing getter.
     MethodDeclaration getter;
     for (AstNode n = node; n != null; n = n.parent) {
@@ -581,6 +597,8 @@
   }
 
   Future<Null> _addProposal_convertIntoGetter() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // Find the enclosing field declaration.
     FieldDeclaration fieldDeclaration;
     for (AstNode n = node; n != null; n = n.parent) {
@@ -630,6 +648,8 @@
   }
 
   Future<Null> _addProposal_convertPartOfToUri() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     PartOfDirective directive =
         node.getAncestor((node) => node is PartOfDirective);
     if (directive == null || directive.libraryName == null) {
@@ -648,6 +668,8 @@
   }
 
   Future<Null> _addProposal_convertToAsyncFunctionBody() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     FunctionBody body = getEnclosingFunctionBody();
     if (body == null || body.isAsynchronous || body.isGenerator) {
       _coverageMarker();
@@ -679,6 +701,8 @@
   }
 
   Future<Null> _addProposal_convertToBlockFunctionBody() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     FunctionBody body = getEnclosingFunctionBody();
     // prepare expression body
     if (body is! ExpressionFunctionBody || body.isGenerator) {
@@ -722,10 +746,14 @@
   }
 
   Future<Null> _addProposal_convertToDoubleQuotedString() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     await _convertQuotes(false, DartAssistKind.CONVERT_TO_DOUBLE_QUOTED_STRING);
   }
 
   Future<Null> _addProposal_convertToExpressionFunctionBody() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // prepare current body
     FunctionBody body = getEnclosingFunctionBody();
     if (body is! BlockFunctionBody || body.isGenerator) {
@@ -777,6 +805,8 @@
   }
 
   Future<Null> _addProposal_convertToFieldParameter() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node == null) {
       return;
     }
@@ -869,6 +899,8 @@
   }
 
   Future<Null> _addProposal_convertToForIndexLoop() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // find enclosing ForEachStatement
     ForEachStatement forEachStatement =
         node.getAncestor((n) => n is ForEachStatement);
@@ -947,6 +979,8 @@
   }
 
   Future<Null> _addProposal_convertToGenericFunctionSyntax() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AstNode node = this.node;
     while (node != null) {
       if (node is FunctionTypeAlias) {
@@ -965,6 +999,8 @@
   }
 
   Future<Null> _addProposal_convertToIsNot_onIs() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // may be child of "is"
     AstNode node = this.node;
     while (node != null && node is! IsExpression) {
@@ -1016,6 +1052,8 @@
   }
 
   Future<Null> _addProposal_convertToIsNot_onNot() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // may be () in prefix expression
     if (node is ParenthesizedExpression && node.parent is PrefixExpression) {
       node = node.parent;
@@ -1070,6 +1108,8 @@
    * Converts "!isEmpty" -> "isNotEmpty" if possible.
    */
   Future<Null> _addProposal_convertToIsNotEmpty() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // prepare "expr.isEmpty"
     AstNode isEmptyAccess = null;
     SimpleIdentifier isEmptyIdentifier = null;
@@ -1128,6 +1168,8 @@
   }
 
   Future<Null> _addProposal_convertToNormalParameter() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is SimpleIdentifier &&
         node.parent is FieldFormalParameter &&
         node.parent.parent is FormalParameterList &&
@@ -1167,10 +1209,14 @@
   }
 
   Future<Null> _addProposal_convertToSingleQuotedString() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     await _convertQuotes(true, DartAssistKind.CONVERT_TO_SINGLE_QUOTED_STRING);
   }
 
   Future<Null> _addProposal_encapsulateField() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // find FieldDeclaration
     FieldDeclaration fieldDeclaration =
         node.getAncestor((x) => x is FieldDeclaration);
@@ -1270,6 +1316,8 @@
   }
 
   Future<Null> _addProposal_exchangeOperands() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // check that user invokes quick assist on binary expression
     if (node is! BinaryExpression) {
       _coverageMarker();
@@ -1325,6 +1373,8 @@
   }
 
   Future<Null> _addProposal_flutterConvertToChildren() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // Find "child: widget" under selection.
     NamedExpression namedExp;
     {
@@ -1354,6 +1404,8 @@
   }
 
   Future<Null> _addProposal_flutterConvertToStatefulWidget() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     ClassDeclaration widgetClass =
         node.getAncestor((n) => n is ClassDeclaration);
     TypeName superclass = widgetClass?.extendsClause?.superclass;
@@ -1428,6 +1480,8 @@
 
     DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       builder.addReplacement(range.node(superclass), (builder) {
         builder.writeType(statefulWidgetClass.type);
       });
@@ -1451,6 +1505,8 @@
   }
 
   Future<Null> _addProposal_flutterMoveWidgetDown() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var widget = flutter.identifyWidgetExpression(node);
     if (widget == null) {
       return;
@@ -1483,6 +1539,8 @@
   }
 
   Future<Null> _addProposal_flutterMoveWidgetUp() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var widget = flutter.identifyWidgetExpression(node);
     if (widget == null) {
       return;
@@ -1514,6 +1572,8 @@
   }
 
   Future<Null> _addProposal_flutterRemoveWidget_multipleChildren() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var widgetCreation = flutter.identifyNewExpression(node);
     if (widgetCreation == null) {
       return;
@@ -1552,6 +1612,8 @@
   }
 
   Future<Null> _addProposal_flutterRemoveWidget_singleChild() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var widgetCreation = flutter.identifyNewExpression(node);
     if (widgetCreation == null) {
       return;
@@ -1577,6 +1639,8 @@
   }
 
   Future<Null> _addProposal_flutterSwapWithChild() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     InstanceCreationExpression parent = flutter.identifyNewExpression(node);
     if (!flutter.isWidgetCreation(parent)) {
       _coverageMarker();
@@ -1596,6 +1660,8 @@
   }
 
   Future<Null> _addProposal_flutterSwapWithParent() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     InstanceCreationExpression child = flutter.identifyNewExpression(node);
     if (!flutter.isWidgetCreation(child)) {
       _coverageMarker();
@@ -1615,6 +1681,8 @@
   }
 
   Future<Null> _addProposal_flutterWrapWidget() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     await _addProposal_flutterWrapWidgetImpl();
     await _addProposal_flutterWrapWidgetImpl(
         kind: DartAssistKind.FLUTTER_WRAP_CENTER,
@@ -1639,6 +1707,8 @@
       String parentLibraryUri,
       String parentClassName,
       List<String> leadingLines: const []}) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     Expression widgetExpr = flutter.identifyWidgetExpression(node);
     if (widgetExpr == null) {
       _coverageMarker();
@@ -1702,6 +1772,8 @@
   }
 
   Future<Null> _addProposal_flutterWrapWidgets() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var selectionRange = new SourceRange(selectionOffset, selectionLength);
     var analyzer = new SelectionAnalyzer(selectionRange);
     unit.accept(analyzer);
@@ -1733,6 +1805,8 @@
         {@required AssistKind kind,
         @required String parentLibraryUri,
         @required String parentClassName}) async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       ClassElement parentClassElement =
           await sessionHelper.getClass(parentLibraryUri, parentClassName);
       ClassElement widgetClassElement =
@@ -1790,6 +1864,8 @@
   }
 
   Future<Null> _addProposal_importAddShow() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // prepare ImportDirective
     ImportDirective importDirective =
         node.getAncestor((node) => node is ImportDirective);
@@ -1833,6 +1909,8 @@
   }
 
   Future<Null> _addProposal_introduceLocalTestedType() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AstNode node = this.node;
     if (node is IfStatement) {
       node = (node as IfStatement).condition;
@@ -1904,6 +1982,8 @@
   }
 
   Future<Null> _addProposal_invertIf() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is! IfStatement) {
       return;
     }
@@ -1930,6 +2010,8 @@
   }
 
   Future<Null> _addProposal_joinIfStatementInner() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // climb up condition to the (supposedly) "if" statement
     AstNode node = this.node;
     while (node is Expression) {
@@ -1990,6 +2072,8 @@
   }
 
   Future<Null> _addProposal_joinIfStatementOuter() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // climb up condition to the (supposedly) "if" statement
     AstNode node = this.node;
     while (node is Expression) {
@@ -2054,6 +2138,8 @@
   }
 
   Future<Null> _addProposal_joinVariableDeclaration_onAssignment() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // check that node is LHS in assignment
     if (node is SimpleIdentifier &&
         node.parent is AssignmentExpression &&
@@ -2129,6 +2215,8 @@
   }
 
   Future<Null> _addProposal_joinVariableDeclaration_onDeclaration() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // prepare enclosing VariableDeclarationList
     VariableDeclarationList declList =
         node.getAncestor((node) => node is VariableDeclarationList);
@@ -2197,6 +2285,8 @@
   }
 
   Future<Null> _addProposal_removeTypeAnnotation() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     VariableDeclarationList declarationList =
         node.getAncestor((n) => n is VariableDeclarationList);
     if (declarationList == null) {
@@ -2241,6 +2331,8 @@
   }
 
   Future<Null> _addProposal_reparentFlutterList() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is! ListLiteral) {
       return;
     }
@@ -2288,6 +2380,8 @@
   }
 
   Future<Null> _addProposal_replaceConditionalWithIfElse() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     ConditionalExpression conditional = null;
     // may be on Statement with Conditional
     Statement statement = node.getAncestor((node) => node is Statement);
@@ -2392,6 +2486,8 @@
   }
 
   Future<Null> _addProposal_replaceIfElseWithConditional() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // should be "if"
     if (node is! IfStatement) {
       _coverageMarker();
@@ -2458,6 +2554,8 @@
   }
 
   Future<Null> _addProposal_splitAndCondition() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // check that user invokes quick assist on binary expression
     if (node is! BinaryExpression) {
       _coverageMarker();
@@ -2549,6 +2647,8 @@
   }
 
   Future<Null> _addProposal_splitVariableDeclaration() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // prepare DartVariableStatement, should be part of Block
     VariableDeclarationStatement statement =
         node.getAncestor((node) => node is VariableDeclarationStatement);
@@ -2587,6 +2687,8 @@
   }
 
   Future<Null> _addProposal_surroundWith() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // prepare selected statements
     List<Statement> selectedStatements;
     {
@@ -2872,6 +2974,8 @@
 
   Future<Null> _convertFunctionTypeAliasToGenericTypeAlias(
       FunctionTypeAlias node) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (!_allParametersHaveTypes(node.parameters)) {
       return;
     }
@@ -2901,6 +3005,8 @@
 
   Future<Null> _convertFunctionTypedFormalParameterToSimpleFormalParameter(
       FunctionTypedFormalParameter node) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (!_allParametersHaveTypes(node.parameters)) {
       return;
     }
@@ -2927,6 +3033,8 @@
   }
 
   Future<Null> _convertQuotes(bool fromDouble, AssistKind kind) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is SimpleStringLiteral) {
       SimpleStringLiteral literal = node;
       if (fromDouble ? !literal.isSingleQuoted : literal.isSingleQuoted) {
@@ -2996,6 +3104,8 @@
 
   Future<void> _swapParentAndChild(InstanceCreationExpression parent,
       InstanceCreationExpression child, AssistKind kind) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // The child must have its own child.
     if (flutter.findChildArgument(child) == null) {
       _coverageMarker();
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 26867a4..c47f71a 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -81,6 +81,8 @@
 class DefaultFixContributor extends DartFixContributor {
   @override
   Future<List<Fix>> internalComputeFixes(DartFixContext context) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     try {
       FixProcessor processor = new FixProcessor(context);
       List<Fix> fixes = await processor.compute();
@@ -93,6 +95,8 @@
 
   Future<List<Fix>> _computeFixAllFixes(
       DartFixContext context, List<Fix> fixes) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     final AnalysisError analysisError = context.error;
     final List<AnalysisError> allAnalysisErrors = context.errors;
 
@@ -274,6 +278,8 @@
   }
 
   Future<List<Fix>> compute() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     try {
       utils = new CorrectionUtils(unit);
     } catch (e) {
@@ -588,6 +594,8 @@
   }
 
   Future<Null> _addFix_addAsync() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     FunctionBody body = node.getAncestor((n) => n is FunctionBody);
     if (body != null && body.keyword == null) {
       TypeProvider typeProvider = await this.typeProvider;
@@ -600,6 +608,8 @@
   }
 
   Future<Null> _addFix_addExplicitCast() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (coveredNode is! Expression) {
       return;
     }
@@ -699,6 +709,8 @@
   }
 
   Future<Null> _addFix_addMissingNamedArgument() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // Prepare the name of the missing parameter.
     if (this.node is! SimpleIdentifier) {
       return;
@@ -730,6 +742,8 @@
     }
 
     Future<void> addParameter(int offset, String prefix, String suffix) async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       if (offset != null) {
         var changeBuilder = new DartChangeBuilder(session);
         await changeBuilder.addFileEdit(context.file, (builder) {
@@ -759,6 +773,8 @@
   }
 
   Future<Null> _addFix_addMissingParameter() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // The error is reported on ArgumentList.
     if (node is! ArgumentList) {
       return;
@@ -781,6 +797,8 @@
 
     Future<void> addParameter(
         FixKind kind, int offset, String prefix, String suffix) async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       if (offset != null) {
         var changeBuilder = new DartChangeBuilder(session);
         await changeBuilder.addFileEdit(context.file, (builder) {
@@ -825,6 +843,8 @@
   }
 
   Future<Null> _addFix_addMissingRequiredArgument() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     InstanceCreationExpression creation;
     Element targetElement;
     ArgumentList argumentList;
@@ -892,6 +912,8 @@
   }
 
   Future<Null> _addFix_addOverrideAnnotation() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     ClassMember member = node.getAncestor((n) => n is ClassMember);
     if (member == null) {
       return;
@@ -917,6 +939,8 @@
   }
 
   Future<Null> _addFix_addRequiredAnnotation() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleInsertion(node.parent.offset, '@required ');
@@ -925,6 +949,8 @@
   }
 
   Future<Null> _addFix_addStatic() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     FieldDeclaration declaration =
         node.getAncestor((n) => n is FieldDeclaration);
     DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
@@ -935,6 +961,8 @@
   }
 
   Future<Null> _addFix_boolInsteadOfBoolean() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleReplacement(range.error(error), 'bool');
@@ -943,6 +971,8 @@
   }
 
   Future<Null> _addFix_canBeNullAfterNullAware() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AstNode node = coveredNode;
     if (node is Expression) {
       DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
@@ -965,6 +995,8 @@
   }
 
   Future<Null> _addFix_changeTypeAnnotation() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AstNode declaration = coveredNode.parent;
     if (declaration is VariableDeclaration &&
         declaration.initializer == coveredNode) {
@@ -996,6 +1028,8 @@
   }
 
   Future<Null> _addFix_convertFlutterChild() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     NamedExpression named = flutter.findNamedExpression(node, 'child');
     if (named == null) {
       return;
@@ -1036,6 +1070,8 @@
   }
 
   Future<Null> _addFix_convertFlutterChildren() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AstNode node = this.node;
     if (node is SimpleIdentifier &&
         node.name == 'children' &&
@@ -1064,6 +1100,8 @@
   }
 
   Future<Null> _addFix_convertToNamedArgument() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var argumentList = this.node;
     if (argumentList is ArgumentList) {
       // Prepare ExecutableElement.
@@ -1132,6 +1170,8 @@
   }
 
   Future<Null> _addFix_createClass() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     Element prefixElement = null;
     String name = null;
     SimpleIdentifier nameNode;
@@ -1215,6 +1255,8 @@
    * class has uninitialized final fields.
    */
   Future<Null> _addFix_createConstructor_forUninitializedFinalFields() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is! SimpleIdentifier || node.parent is! VariableDeclaration) {
       return;
     }
@@ -1291,6 +1333,8 @@
   }
 
   Future<Null> _addFix_createConstructor_insteadOfSyntheticDefault() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is! ArgumentList) {
       return;
     }
@@ -1334,6 +1378,8 @@
   }
 
   Future<Null> _addFix_createConstructor_named() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     SimpleIdentifier name = null;
     ConstructorName constructorName = null;
     InstanceCreationExpression instanceCreation = null;
@@ -1392,6 +1438,8 @@
   }
 
   Future<Null> _addFix_createConstructorSuperExplicit() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node.parent is! ConstructorDeclaration ||
         node.parent.parent is! ClassDeclaration) {
       return;
@@ -1461,6 +1509,8 @@
   }
 
   Future<Null> _addFix_createConstructorSuperImplicit() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     ClassDeclaration targetClassNode = node.parent as ClassDeclaration;
     ClassElement targetClassElement = targetClassNode.element;
     InterfaceType superType = targetClassElement.supertype;
@@ -1528,6 +1578,8 @@
   }
 
   Future<Null> _addFix_createField() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is! SimpleIdentifier) {
       return;
     }
@@ -1603,6 +1655,8 @@
   }
 
   Future<Null> _addFix_createField_initializingFormal() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     //
     // Ensure that we are in an initializing formal parameter.
     //
@@ -1637,6 +1691,8 @@
   }
 
   Future<Null> _addFix_createFunction_forFunctionType() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is SimpleIdentifier) {
       SimpleIdentifier nameNode = node as SimpleIdentifier;
       // prepare argument expression (to get parameter)
@@ -1685,6 +1741,8 @@
   }
 
   Future<Null> _addFix_createGetter() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is! SimpleIdentifier) {
       return;
     }
@@ -1760,6 +1818,8 @@
   }
 
   Future<Null> _addFix_createImportUri() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // TODO(brianwilkerson) Generalize this to allow other valid string literals.
     // TODO(brianwilkerson) Support the case where the node's parent is a Configuration.
     if (node is SimpleStringLiteral && node.parent is ImportDirective) {
@@ -1786,6 +1846,8 @@
   }
 
   Future<Null> _addFix_createLocalVariable() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is! SimpleIdentifier) {
       return;
     }
@@ -1837,6 +1899,8 @@
   }
 
   Future<Null> _addFix_createMissingOverrides() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node.parent is! ClassDeclaration) {
       return;
     }
@@ -1986,6 +2050,8 @@
   }
 
   Future<Null> _addFix_createNoSuchMethod() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node.parent is! ClassDeclaration) {
       return;
     }
@@ -2012,6 +2078,8 @@
   }
 
   Future<Null> _addFix_createPartUri() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // TODO(brianwilkerson) Generalize this to allow other valid string literals.
     if (node is SimpleStringLiteral && node.parent is PartDirective) {
       PartDirective partDirective = node.parent;
@@ -2031,6 +2099,8 @@
   }
 
   Future<Null> _addFix_illegalAsyncReturnType() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // prepare the existing type
     TypeAnnotation typeName = node.getAncestor((n) => n is TypeAnnotation);
     TypeProvider typeProvider = this.typeProvider;
@@ -2042,6 +2112,8 @@
   }
 
   Future<Null> _addFix_importLibrary(FixKind kind, Uri library) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String uriText;
     DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
@@ -2052,6 +2124,8 @@
 
   Future<Null> _addFix_importLibrary_withElement(String name,
       List<ElementKind> elementKinds, TopLevelDeclarationKind kind2) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // ignore if private
     if (name.startsWith('_')) {
       return;
@@ -2153,6 +2227,8 @@
   }
 
   Future<Null> _addFix_importLibrary_withFunction() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is SimpleIdentifier && node.parent is MethodInvocation) {
       MethodInvocation invocation = node.parent as MethodInvocation;
       if (invocation.realTarget == null && invocation.methodName == node) {
@@ -2164,6 +2240,8 @@
   }
 
   Future<Null> _addFix_importLibrary_withTopLevelVariable() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is SimpleIdentifier) {
       String name = (node as SimpleIdentifier).name;
       await _addFix_importLibrary_withElement(
@@ -2174,6 +2252,8 @@
   }
 
   Future<Null> _addFix_importLibrary_withType() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (_mayBeTypeIdentifier(node)) {
       String typeName = (node as SimpleIdentifier).name;
       await _addFix_importLibrary_withElement(
@@ -2188,6 +2268,8 @@
   }
 
   Future<Null> _addFix_insertSemicolon() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (error.message.contains("';'")) {
       if (_isAwaitNode()) {
         return;
@@ -2202,6 +2284,8 @@
   }
 
   Future<Null> _addFix_isNotEmpty() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is! PrefixExpression) {
       return;
     }
@@ -2228,6 +2312,8 @@
   }
 
   Future<Null> _addFix_isNotNull() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (coveredNode is IsExpression) {
       IsExpression isExpression = coveredNode as IsExpression;
       DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
@@ -2243,6 +2329,8 @@
   }
 
   Future<Null> _addFix_isNull() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (coveredNode is IsExpression) {
       IsExpression isExpression = coveredNode as IsExpression;
       DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
@@ -2258,6 +2346,8 @@
   }
 
   Future<Null> _addFix_makeEnclosingClassAbstract() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     ClassDeclaration enclosingClass =
         node.getAncestor((node) => node is ClassDeclaration);
     if (enclosingClass == null) {
@@ -2274,6 +2364,8 @@
   }
 
   Future<Null> _addFix_makeFieldNotFinal() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AstNode node = this.node;
     if (node is SimpleIdentifier &&
         node.bestElement is PropertyAccessorElement) {
@@ -2317,6 +2409,8 @@
   }
 
   Future<Null> _addFix_makeVariableFinal() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AstNode node = this.node;
     if (node is SimpleIdentifier && node.parent is VariableDeclaration) {
       VariableDeclaration declaration = node.parent;
@@ -2336,6 +2430,8 @@
   }
 
   Future<Null> _addFix_nonBoolCondition_addNotNull() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleInsertion(error.offset + error.length, ' != null');
@@ -2344,6 +2440,8 @@
   }
 
   Future<Null> _addFix_removeAwait() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     final awaitExpression = node;
     if (awaitExpression is AwaitExpression) {
       final awaitToken = awaitExpression.awaitKeyword;
@@ -2356,6 +2454,8 @@
   }
 
   Future<Null> _addFix_removeDeadCode() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AstNode coveringNode = this.coveredNode;
     if (coveringNode is Expression) {
       AstNode parent = coveredNode.parent;
@@ -2397,6 +2497,8 @@
   }
 
   Future<Null> _addFix_removeEmptyCatch() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addDeletion(utils.getLinesRange(range.node(node.parent)));
@@ -2405,6 +2507,8 @@
   }
 
   Future<Null> _addFix_removeEmptyConstructorBody() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleReplacement(
@@ -2415,6 +2519,8 @@
   }
 
   Future<Null> _addFix_removeEmptyElse() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     IfStatement ifStatement = node.parent;
     DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
@@ -2425,6 +2531,8 @@
   }
 
   Future<Null> _addFix_removeEmptyStatement() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     EmptyStatement emptyStatement = node;
     if (emptyStatement.parent is Block) {
       DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
@@ -2446,6 +2554,8 @@
   }
 
   Future<Null> _addFix_removeInitializer() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // Retrieve the linted node.
     VariableDeclaration ancestor =
         node.getAncestor((a) => a is VariableDeclaration);
@@ -2460,6 +2570,8 @@
   }
 
   Future<Null> _addFix_removeInterpolationBraces() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AstNode node = this.node;
     if (node is InterpolationExpression) {
       Token right = node.rightBracket;
@@ -2477,6 +2589,8 @@
   }
 
   Future<Null> _addFix_removeMethodDeclaration() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     MethodDeclaration declaration =
         node.getAncestor((node) => node is MethodDeclaration);
     if (declaration != null) {
@@ -2489,6 +2603,8 @@
   }
 
   Future<Null> _addFix_removeParameters_inGetterDeclaration() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is MethodDeclaration) {
       MethodDeclaration method = node as MethodDeclaration;
       SimpleIdentifier name = method.name;
@@ -2505,6 +2621,8 @@
   }
 
   Future<Null> _addFix_removeParentheses_inGetterInvocation() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is SimpleIdentifier && node.parent is MethodInvocation) {
       MethodInvocation invocation = node.parent as MethodInvocation;
       if (invocation.methodName == node && invocation.target != null) {
@@ -2519,6 +2637,8 @@
   }
 
   Future<Null> _addFix_removeThisExpression() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     final thisExpression = node is ThisExpression
         ? node
         : node.getAncestor((node) => node is ThisExpression);
@@ -2539,6 +2659,8 @@
   }
 
   Future<Null> _addFix_removeTypeAnnotation() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     final TypeAnnotation type =
         node.getAncestor((node) => node is TypeAnnotation);
     if (type != null) {
@@ -2551,6 +2673,8 @@
   }
 
   Future<Null> _addFix_removeUnnecessaryCast() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (coveredNode is! AsExpression) {
       return;
     }
@@ -2567,6 +2691,8 @@
   }
 
   Future<Null> _addFix_removeUnusedCatchClause() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is SimpleIdentifier) {
       AstNode catchClause = node.parent;
       if (catchClause is CatchClause &&
@@ -2583,6 +2709,8 @@
   }
 
   Future<Null> _addFix_removeUnusedCatchStack() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is SimpleIdentifier) {
       AstNode catchClause = node.parent;
       if (catchClause is CatchClause &&
@@ -2600,6 +2728,8 @@
   }
 
   Future<Null> _addFix_removeUnusedImport() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // prepare ImportDirective
     ImportDirective importDirective =
         node.getAncestor((node) => node is ImportDirective);
@@ -2615,6 +2745,8 @@
   }
 
   Future<Null> _addFix_renameToCamelCase() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is! SimpleIdentifier) {
       return;
     }
@@ -2656,6 +2788,8 @@
   }
 
   Future<Null> _addFix_replaceFinalWithConst() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is VariableDeclarationList) {
       DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
@@ -2667,6 +2801,8 @@
   }
 
   Future<Null> _addFix_replaceVarWithDynamic() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleReplacement(range.error(error), 'dynamic');
@@ -2675,6 +2811,8 @@
   }
 
   Future<Null> _addFix_replaceWithConditionalAssignment() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     IfStatement ifStatement = node is IfStatement
         ? node
         : node.getAncestor((node) => node is IfStatement);
@@ -2710,6 +2848,8 @@
   }
 
   Future<Null> _addFix_replaceWithConstInstanceCreation() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (coveredNode is InstanceCreationExpression) {
       var instanceCreation = coveredNode as InstanceCreationExpression;
       DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
@@ -2727,6 +2867,8 @@
   }
 
   Future<Null> _addFix_replaceWithIdentifier() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     final FunctionTypedFormalParameter functionTyped =
         node.getAncestor((node) => node is FunctionTypedFormalParameter);
     if (functionTyped != null) {
@@ -2742,6 +2884,8 @@
   }
 
   Future<Null> _addFix_replaceWithLiteral() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     final InstanceCreationExpression instanceCreation =
         node.getAncestor((node) => node is InstanceCreationExpression);
     final InterfaceType type = instanceCreation.staticType;
@@ -2764,12 +2908,16 @@
   }
 
   Future<Null> _addFix_replaceWithTearOff() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     FunctionExpression ancestor =
         node.getAncestor((a) => a is FunctionExpression);
     if (ancestor == null) {
       return;
     }
     Future<Null> addFixOfExpression(InvocationExpression expression) async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addReplacement(range.node(ancestor), (DartEditBuilder builder) {
@@ -2800,6 +2948,8 @@
   }
 
   Future<Null> _addFix_undefinedClass_useSimilar() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AstNode node = this.node;
     // Prepare the optional import prefix name.
     String prefixName = null;
@@ -2849,6 +2999,8 @@
   }
 
   Future<Null> _addFix_undefinedClassAccessor_useSimilar() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AstNode node = this.node;
     if (node is SimpleIdentifier) {
       // prepare target
@@ -2878,6 +3030,8 @@
 
   Future<Null> _addFix_undefinedClassMember_useSimilar(
       Expression target, ElementPredicate predicate) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is SimpleIdentifier) {
       String name = (node as SimpleIdentifier).name;
       _ClosestElementFinder finder =
@@ -2911,6 +3065,8 @@
   }
 
   Future<Null> _addFix_undefinedFunction_create() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // should be the name of the invocation
     if (node is SimpleIdentifier && node.parent is MethodInvocation) {
     } else {
@@ -2958,6 +3114,8 @@
   }
 
   Future<Null> _addFix_undefinedFunction_useSimilar() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AstNode node = this.node;
     if (node is SimpleIdentifier) {
       // Prepare the optional import prefix name.
@@ -3004,6 +3162,8 @@
   }
 
   Future<Null> _addFix_undefinedMethod_create() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is SimpleIdentifier && node.parent is MethodInvocation) {
       String name = (node as SimpleIdentifier).name;
       MethodInvocation invocation = node.parent as MethodInvocation;
@@ -3088,6 +3248,8 @@
   }
 
   Future<Null> _addFix_undefinedMethod_useSimilar() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node.parent is MethodInvocation) {
       MethodInvocation invocation = node.parent as MethodInvocation;
       await _addFix_undefinedClassMember_useSimilar(invocation.realTarget,
@@ -3096,6 +3258,8 @@
   }
 
   Future<Null> _addFix_undefinedMethodWithContructor() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is SimpleIdentifier && node.parent is MethodInvocation) {
       DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
@@ -3114,6 +3278,8 @@
    * final fields.
    */
   Future<Null> _addFix_updateConstructor_forUninitializedFinalFields() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is! SimpleIdentifier || node.parent is! ConstructorDeclaration) {
       return;
     }
@@ -3174,6 +3340,8 @@
   }
 
   Future<Null> _addFix_useEffectiveIntegerDivision() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     for (AstNode n = node; n != null; n = n.parent) {
       if (n is MethodInvocation &&
           n.offset == errorOffset &&
@@ -3201,6 +3369,8 @@
    * the given [element].
    */
   Future<Null> _addFix_useStaticAccess(AstNode target, Element element) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     Element declaringElement = element.enclosingElement;
     if (declaringElement is ClassElement) {
       DartType declaringType = declaringElement.type;
@@ -3217,6 +3387,8 @@
   }
 
   Future<Null> _addFix_useStaticAccess_method() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is SimpleIdentifier && node.parent is MethodInvocation) {
       MethodInvocation invocation = node.parent as MethodInvocation;
       if (invocation.methodName == node) {
@@ -3228,6 +3400,8 @@
   }
 
   Future<Null> _addFix_useStaticAccess_property() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (node is SimpleIdentifier && node.parent is PrefixedIdentifier) {
       PrefixedIdentifier prefixed = node.parent as PrefixedIdentifier;
       if (prefixed.identifier == node) {
@@ -3262,6 +3436,8 @@
       String sourcePrefix,
       String sourceSuffix,
       Element target) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // build method source
     String targetFile = targetSource.fullName;
     DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
@@ -3324,6 +3500,8 @@
    */
   Future<Null> _addProposal_createFunction_function(
       FunctionType functionType) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String name = (node as SimpleIdentifier).name;
     // prepare environment
     int insertOffset = unit.end;
@@ -3351,6 +3529,8 @@
    */
   Future<Null> _addProposal_createFunction_method(
       ClassElement targetClassElement, FunctionType functionType) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String name = (node as SimpleIdentifier).name;
     // prepare environment
     Source targetSource = targetClassElement.source;
@@ -3907,6 +4087,8 @@
    * be found.
    */
   Future<FormalParameterList> getParameterList() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var name = await astProvider.getParsedNameForElement(executable);
     AstNode targetDeclaration = name?.parent;
     if (targetDeclaration is ConstructorDeclaration) {
@@ -3925,6 +4107,8 @@
    * or `null` is cannot be found.
    */
   Future<FormalParameter> getParameterNode(ParameterElement element) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var name = await astProvider.getParsedNameForElement(element);
     for (AstNode node = name; node != null; node = node.parent) {
       if (node is FormalParameter && node.parent is FormalParameterList) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart b/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
index 0051772..598057e 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
@@ -48,6 +48,8 @@
 
   @override
   Future<SourceChange> createChange() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     change = new SourceChange(refactoringName);
     // function
     if (element.enclosingElement is CompilationUnitElement) {
@@ -60,6 +62,8 @@
       Set<ClassMemberElement> elements =
           await getHierarchyMembers(searchEngine, field);
       await Future.forEach(elements, (ClassMemberElement member) async {
+        // TODO(brianwilkerson) Determine whether this await is necessary.
+        await null;
         if (member is FieldElement) {
           PropertyAccessorElement getter = member.getter;
           if (!getter.isSynthetic) {
@@ -86,6 +90,8 @@
 
   Future<Null> _updateElementDeclaration(
       PropertyAccessorElement element) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // prepare "get" keyword
     Token getKeyword = null;
     {
@@ -114,6 +120,8 @@
   }
 
   Future _updateElementReferences(Element element) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<SearchMatch> matches = await searchEngine.searchReferences(element);
     List<SourceReference> references = getSourceReferences(matches);
     for (SourceReference reference in references) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart b/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart
index 2ff0f5b..a6a2c7b 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart
@@ -42,6 +42,8 @@
 
   @override
   Future<RefactoringStatus> checkInitialConditions() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // check Element type
     if (element is FunctionElement) {
       if (element.enclosingElement is! CompilationUnitElement) {
@@ -68,6 +70,8 @@
 
   @override
   Future<SourceChange> createChange() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     change = new SourceChange(refactoringName);
     // FunctionElement
     if (element is FunctionElement) {
@@ -80,6 +84,8 @@
       Set<ClassMemberElement> elements =
           await getHierarchyMembers(searchEngine, method);
       await Future.forEach(elements, (Element element) async {
+        // TODO(brianwilkerson) Determine whether this await is necessary.
+        await null;
         await _updateElementDeclaration(element);
         return _updateElementReferences(element);
       });
@@ -92,6 +98,8 @@
   bool requiresPreview() => false;
 
   Future<Null> _updateElementDeclaration(Element element) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // prepare parameters
     FormalParameterList parameters;
     {
@@ -118,6 +126,8 @@
   }
 
   Future<Null> _updateElementReferences(Element element) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<SearchMatch> matches = await searchEngine.searchReferences(element);
     List<SourceReference> references = getSourceReferences(matches);
     for (SourceReference reference in references) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
index f8865c5..71baf5a 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
@@ -188,6 +188,8 @@
 
   @override
   Future<RefactoringStatus> checkFinalConditions() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     RefactoringStatus result = new RefactoringStatus();
     result.addStatus(validateMethodName(name));
     result.addStatus(_checkParameterNames());
@@ -198,6 +200,8 @@
 
   @override
   Future<RefactoringStatus> checkInitialConditions() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     RefactoringStatus result = new RefactoringStatus();
     // selection
     result.addStatus(_checkSelection());
@@ -236,6 +240,8 @@
 
   @override
   Future<SourceChange> createChange() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     SourceChange change = new SourceChange(refactoringName);
     // replace occurrences with method invocation
     for (_Occurrence occurrence in _occurrences) {
@@ -439,6 +445,8 @@
    * Checks if created method will shadow or will be shadowed by other elements.
    */
   Future<RefactoringStatus> _checkPossibleConflicts() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     RefactoringStatus result = new RefactoringStatus();
     AstNode parent = _parentMember.parent;
     // top-level function
@@ -715,6 +723,8 @@
    * parameters.
    */
   Future<RefactoringStatus> _initializeParameters() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     _parameters.clear();
     _parametersMap.clear();
     _parameterReferencesMap.clear();
@@ -773,6 +783,8 @@
   }
 
   Future<Null> _initializeReturnType() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     TypeProvider typeProvider = await session.typeProvider;
     InterfaceType futureType = typeProvider.futureType;
     if (_selectionFunctionExpression != null) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
index 1ad85d0..9f8e17b 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
@@ -88,6 +88,8 @@
 
   @override
   Future<RefactoringStatus> checkFinalConditions() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     RefactoringStatus result = new RefactoringStatus();
     result.addStatus(validateClassName(name));
     return result;
@@ -95,6 +97,8 @@
 
   @override
   Future<RefactoringStatus> checkInitialConditions() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     RefactoringStatus result = new RefactoringStatus();
 
     result.addStatus(_checkSelection());
@@ -138,6 +142,8 @@
 
   @override
   Future<SourceChange> createChange() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String file = unitElement.source.fullName;
     var changeBuilder = new DartChangeBuilder(sessionHelper.session);
     await changeBuilder.addFileEdit(file, (builder) {
@@ -171,7 +177,12 @@
 
   /// Checks if [offset] is a widget creation expression that can be extracted.
   RefactoringStatus _checkSelection() {
-    AstNode node = new NodeLocator2(offset, offset + length).searchWithin(unit);
+    AstNode node = new NodeLocator(offset, offset + length).searchWithin(unit);
+
+    // Treat single ReturnStatement as its expression.
+    if (node is ReturnStatement) {
+      node = (node as ReturnStatement).expression;
+    }
 
     // Find the enclosing class.
     _enclosingClassNode = node?.getAncestor((n) => n is ClassDeclaration);
@@ -229,9 +240,13 @@
   }
 
   Future<RefactoringStatus> _initializeClasses() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var result = new RefactoringStatus();
 
     Future<ClassElement> getClass(String name) async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       const uri = 'package:flutter/widgets.dart';
       var element = await sessionHelper.getClass(uri, name);
       if (element == null) {
@@ -241,6 +256,8 @@
     }
 
     Future<PropertyAccessorElement> getAccessor(String uri, String name) async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       var element = await sessionHelper.getTopLevelPropertyAccessor(uri, name);
       if (element == null) {
         result.addFatalError("Unable to find 'required' in $uri");
@@ -262,6 +279,8 @@
   /// Prepare referenced local variables and fields, that should be turned
   /// into the widget class fields and constructor parameters.
   Future<RefactoringStatus> _initializeParameters() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     _ParametersCollector collector;
     if (_expression != null) {
       SourceRange localRange = range.node(_expression);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
index 586080a..8a18e3e 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
@@ -68,6 +68,8 @@
 
   @override
   Future<RefactoringStatus> checkInitialConditions() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     RefactoringStatus result = new RefactoringStatus();
     // prepare variable
     {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
index 83da06e..3cc06e2 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
@@ -272,6 +272,8 @@
 
   @override
   Future<RefactoringStatus> checkInitialConditions() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     RefactoringStatus result = new RefactoringStatus();
     // prepare method information
     result.addStatus(await _prepareMethod());
@@ -311,6 +313,8 @@
   bool requiresPreview() => false;
 
   Future<FunctionDeclaration> _computeFunctionDeclaration() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     CompilationUnit unit = await _unitCache.getUnit(_methodElement);
     return new NodeLocator(_methodElement.nameOffset)
         .searchWithin(unit)
@@ -318,6 +322,8 @@
   }
 
   Future<MethodDeclaration> _computeMethodDeclaration() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     CompilationUnit unit = await _unitCache.getUnit(_methodElement);
     return new NodeLocator(_methodElement.nameOffset)
         .searchWithin(unit)
@@ -338,6 +344,8 @@
    * Initializes [_methodElement] and related fields.
    */
   Future<RefactoringStatus> _prepareMethod() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     _methodElement = null;
     _methodParameters = null;
     _methodBody = null;
@@ -457,6 +465,8 @@
   _ReferenceProcessor(this.ref, this.reference);
 
   Future<Null> init() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     refElement = reference.element;
     // prepare CorrectionUtils
     CompilationUnit refUnit = await ref._unitCache.getUnit(refElement);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
index f99d9db..dc7777c 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
@@ -498,6 +498,8 @@
   }
 
   Future<CompilationUnit> getUnit(Element element) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     CompilationUnitElement unitElement = getUnitElement(element);
     CompilationUnit unit = _map[unitElement];
     if (unit == null) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
index eebc587..2a81869 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
@@ -45,6 +45,8 @@
 
   @override
   Future<RefactoringStatus> checkAllConditions() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     RefactoringStatus result = new RefactoringStatus();
     result.addStatus(await checkInitialConditions());
     if (result.hasFatalError) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename.dart b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
index 716b2de13..aa110e0 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
@@ -89,6 +89,8 @@
 
   @override
   Future<SourceChange> createChange() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String changeName = "$refactoringName '$oldName' to '$newName'";
     change = new SourceChange(changeName);
     await fillChange();
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
index 7c58a69..847b333 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
@@ -64,6 +64,8 @@
 
   @override
   Future<RefactoringStatus> checkInitialConditions() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     RefactoringStatus result = await super.checkInitialConditions();
     if (element is MethodElement && (element as MethodElement).isOperator) {
       result.addFatalError('Cannot rename operator.');
@@ -85,6 +87,8 @@
 
   @override
   Future fillChange() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // update declarations
     for (Element renameElement in _validator.elements) {
       if (renameElement.isSynthetic && renameElement is FieldElement) {
@@ -159,6 +163,8 @@
         elementKind = element.kind;
 
   Future<RefactoringStatus> validate() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // check if there is a member with "newName" in the same ClassElement
     for (Element newNameMember in getChildren(elementClass, name)) {
       result.addError(
@@ -249,8 +255,12 @@
   }
 
   Future<_MatchShadowedByLocal> _getShadowingLocalElement() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var localElementMap = <CompilationUnitElement, List<LocalElement>>{};
     Future<List<LocalElement>> getLocalElements(Element element) async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       var unitElement = unitCache.getUnitElement(element);
       var localElements = localElementMap[unitElement];
       if (localElements == null) {
@@ -285,6 +295,8 @@
    * Fills [elements] with [Element]s to rename.
    */
   Future _prepareElements() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (element is ClassMemberElement) {
       elements = await getHierarchyMembers(searchEngine, element);
     } else {
@@ -296,11 +308,15 @@
    * Fills [references] with all references to [elements].
    */
   Future _prepareReferences() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (!isRename) {
       return new Future.value();
     }
     await _prepareElements();
     await Future.forEach(elements, (Element element) async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       List<SearchMatch> elementReferences =
           await searchEngine.searchReferences(element);
       references.addAll(elementReferences);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
index ccdb578..661eea2 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
@@ -57,6 +57,8 @@
 
   @override
   Future fillChange() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // prepare references
     List<SearchMatch> matches = await searchEngine.searchReferences(element);
     List<SourceReference> references = getSourceReferences(matches);
@@ -112,6 +114,8 @@
   }
 
   Future<Null> _replaceSynthetic() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     ClassElement classElement = element.enclosingElement;
     AstNode name = await astProvider.getResolvedNameForElement(classElement);
     ClassDeclaration classNode = name.parent as ClassDeclaration;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
index 826fcf0..2ebf57a 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
@@ -53,6 +53,8 @@
 
   @override
   Future fillChange() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // update declaration
     {
       PrefixElement prefix = element.prefix;
@@ -107,6 +109,8 @@
    * Return the [ImportDirective] node that corresponds to the [element].
    */
   Future<ImportDirective> _findNode() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     LibraryElement library = element.library;
     CompilationUnit unit = await astProvider.getParsedUnitForElement(library);
     int index = library.imports.indexOf(element);
@@ -120,6 +124,8 @@
    */
   Future<SimpleIdentifier> _getInterpolationIdentifier(
       SourceReference reference) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     Source source = reference.element.source;
     AnalysisSession currentSession = astProvider.driver.currentSession;
     ParseResult result = await currentSession.getParsedAst(source.fullName);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
index d452e7d..c417805 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
@@ -48,6 +48,8 @@
 
   @override
   Future<RefactoringStatus> checkFinalConditions() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     RefactoringStatus result = new RefactoringStatus();
     await _prepareElements();
     for (LocalElement element in elements) {
@@ -74,6 +76,8 @@
 
   @override
   Future fillChange() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     for (Element element in elements) {
       addDeclarationEdit(element);
       var references = await searchEngine.searchReferences(element);
@@ -91,6 +95,8 @@
    * Fills [elements] with [Element]s to rename.
    */
   Future _prepareElements() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     Element element = this.element;
     if (element is ParameterElement && element.isNamed) {
       elements = await getHierarchyNamedParameters(searchEngine, element);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
index 5f483a9..29096a3 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
@@ -134,6 +134,8 @@
   }
 
   Future<RefactoringStatus> validate() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     _validateWillConflict();
     if (isRename) {
       references = await searchEngine.searchReferences(element);
@@ -226,6 +228,8 @@
    * Validates if renamed [element] will shadow any [Element] named [name].
    */
   Future _validateWillShadow() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<SearchMatch> declarations =
         await searchEngine.searchMemberDeclarations(name);
     for (SearchMatch declaration in declarations) {
diff --git a/pkg/analysis_server/lib/src/services/search/element_visitors.dart b/pkg/analysis_server/lib/src/services/search/element_visitors.dart
index 3297709..bbd4233 100644
--- a/pkg/analysis_server/lib/src/services/search/element_visitors.dart
+++ b/pkg/analysis_server/lib/src/services/search/element_visitors.dart
@@ -6,6 +6,23 @@
 import 'package:analyzer/dart/element/visitor.dart';
 
 /**
+ * Return the [Element] that is either [root], or one of its direct or
+ * indirect children, and has the given [nameOffset].
+ */
+Element findElementByNameOffset(Element root, int nameOffset) {
+  if (root == null) {
+    return null;
+  }
+  try {
+    var visitor = new _ElementByNameOffsetVisitor(nameOffset);
+    root.accept(visitor);
+  } on Element catch (result) {
+    return result;
+  }
+  return null;
+}
+
+/**
  * Uses [processor] to visit all of the children of [element].
  * If [processor] returns `true`, then children of a child are visited too.
  */
@@ -28,6 +45,24 @@
 typedef bool ElementProcessor(Element element);
 
 /**
+ * A visitor that finds the deep-most [Element] that contains the [nameOffset].
+ */
+class _ElementByNameOffsetVisitor extends GeneralizingElementVisitor {
+  final int nameOffset;
+
+  _ElementByNameOffsetVisitor(this.nameOffset);
+
+  visitElement(Element element) {
+    if (element.nameOffset != -1 &&
+        !element.isSynthetic &&
+        element.nameOffset == nameOffset) {
+      throw element;
+    }
+    super.visitElement(element);
+  }
+}
+
+/**
  * A [GeneralizingElementVisitor] adapter for [ElementProcessor].
  */
 class _ElementVisitorAdapter extends GeneralizingElementVisitor {
diff --git a/pkg/analysis_server/lib/src/services/search/hierarchy.dart b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
index 6441488..a1f03ae 100644
--- a/pkg/analysis_server/lib/src/services/search/hierarchy.dart
+++ b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
@@ -57,6 +57,8 @@
  */
 Future<Set<ClassElement>> getDirectSubClasses(
     SearchEngine searchEngine, ClassElement seed) async {
+  // TODO(brianwilkerson) Determine whether this await is necessary.
+  await null;
   List<SearchMatch> matches = await searchEngine.searchSubtypes(seed);
   return matches.map((match) => match.element).cast<ClassElement>().toSet();
 }
@@ -67,6 +69,8 @@
  */
 Future<Set<ClassMemberElement>> getHierarchyMembers(
     SearchEngine searchEngine, ClassMemberElement member) async {
+  // TODO(brianwilkerson) Determine whether this await is necessary.
+  await null;
   Set<ClassMemberElement> result = new HashSet<ClassMemberElement>();
   // static elements
   if (member.isStatic || member is ConstructorElement) {
@@ -105,6 +109,8 @@
  */
 Future<List<ParameterElement>> getHierarchyNamedParameters(
     SearchEngine searchEngine, ParameterElement element) async {
+  // TODO(brianwilkerson) Determine whether this await is necessary.
+  await null;
   if (element.isNamed) {
     Element method = element.enclosingElement;
     if (method is MethodElement) {
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
index 496db3d..a0d3130 100644
--- a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
@@ -20,6 +20,8 @@
 
   @override
   Future<Set<String>> membersOfSubtypes(ClassElement type) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<AnalysisDriver> drivers = _drivers.toList();
 
     String libraryUriStr = type.librarySource.uri.toString();
@@ -28,6 +30,8 @@
     Set<String> members = new Set<String>();
 
     Future<Null> addMembers(ClassElement type, SubtypeResult subtype) async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       if (subtype != null && !visitedIds.add(subtype.id)) {
         return;
       }
@@ -54,9 +58,13 @@
 
   @override
   Future<Set<ClassElement>> searchAllSubtypes(ClassElement type) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     Set<ClassElement> allSubtypes = new Set<ClassElement>();
 
     Future<Null> addSubtypes(ClassElement type) async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       List<SearchResult> directResults = await _searchDirectSubtypes(type);
       for (SearchResult directResult in directResults) {
         var directSubtype = directResult.enclosingElement as ClassElement;
@@ -72,6 +80,8 @@
 
   @override
   Future<List<SearchMatch>> searchMemberDeclarations(String name) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<SearchMatch> allDeclarations = [];
     List<AnalysisDriver> drivers = _drivers.toList();
     for (AnalysisDriver driver in drivers) {
@@ -83,6 +93,8 @@
 
   @override
   Future<List<SearchMatch>> searchMemberReferences(String name) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<SearchResult> allResults = [];
     List<AnalysisDriver> drivers = _drivers.toList();
     SearchedFiles searchedFiles = _createSearchedFiles(drivers);
@@ -96,6 +108,8 @@
 
   @override
   Future<List<SearchMatch>> searchReferences(Element element) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<SearchResult> allResults = [];
     List<AnalysisDriver> drivers = _drivers.toList();
     SearchedFiles searchedFiles = _createSearchedFiles(drivers);
@@ -109,12 +123,16 @@
 
   @override
   Future<List<SearchMatch>> searchSubtypes(ClassElement type) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<SearchResult> results = await _searchDirectSubtypes(type);
     return results.map(SearchMatchImpl.forSearchResult).toList();
   }
 
   @override
   Future<List<SearchMatch>> searchTopLevelDeclarations(String pattern) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     Set<Element> allElements = new Set<Element>();
     RegExp regExp = new RegExp(pattern);
     List<AnalysisDriver> drivers = _drivers.toList();
@@ -138,6 +156,8 @@
   }
 
   Future<List<SearchResult>> _searchDirectSubtypes(ClassElement type) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<SearchResult> allResults = [];
     List<AnalysisDriver> drivers = _drivers.toList();
     SearchedFiles searchedFiles = _createSearchedFiles(drivers);
diff --git a/pkg/analysis_server/lib/src/status/diagnostics.dart b/pkg/analysis_server/lib/src/status/diagnostics.dart
index b579add..a21b681 100644
--- a/pkg/analysis_server/lib/src/status/diagnostics.dart
+++ b/pkg/analysis_server/lib/src/status/diagnostics.dart
@@ -172,6 +172,8 @@
 
   @override
   Future<Null> generateContent(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String path = params['file'];
     if (path == null) {
       p('No file path provided.');
@@ -198,6 +200,8 @@
 
   @override
   Future<Null> generatePage(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     try {
       _description = params['file'];
       await super.generatePage(params);
@@ -215,6 +219,8 @@
 
   @override
   Future generateContent(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     void writeRow(List<String> data, {List<String> classes}) {
       buf.write("<tr>");
       for (int i = 0; i < data.length; i++) {
@@ -303,6 +309,8 @@
 
   @override
   Future generateContent(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     CompletionDomainHandler completionDomain = server.handlers
         .firstWhere((handler) => handler is CompletionDomainHandler);
 
@@ -394,6 +402,8 @@
 
   @override
   Future generateContent(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     Map<Folder, AnalysisDriver> driverMap = server.driverMap;
     if (driverMap.isEmpty) {
       blankslate('No contexts.');
@@ -574,10 +584,14 @@
       (site as DiagnosticsSite).socketServer.analysisServer;
 
   Future<Null> generateContainer(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     buf.writeln('<div class="columns docs-layout">');
     buf.writeln('<div class="three-fourths column markdown-body">');
     h1(title, classes: 'page-title');
     await asyncDiv(() async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       p(description);
       await generateContent(params);
     }, classes: 'markdown-body');
@@ -618,6 +632,8 @@
   }
 
   Future<Null> generatePage(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     buf.writeln('<!DOCTYPE html><html lang="en">');
     buf.write('<head>');
     buf.write('<meta charset="utf-8">');
@@ -656,6 +672,8 @@
   bool get showInNav => true;
 
   Future<Null> generateContainer(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     buf.writeln('<div class="columns docs-layout">');
 
     bool shouldShowInNav(Page page) {
@@ -679,6 +697,8 @@
     buf.writeln('<div class="four-fifths column markdown-body">');
     h1(title, classes: 'page-title');
     await asyncDiv(() async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       p(description);
       await generateContent(params);
     }, classes: 'markdown-body');
@@ -750,6 +770,8 @@
 
   @override
   Future<Null> generateContent(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String path = params['file'];
     if (path == null) {
       p('No file path provided.');
@@ -776,6 +798,8 @@
 
   @override
   Future<Null> generatePage(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     try {
       _description = params['file'];
       await super.generatePage(params);
@@ -793,6 +817,8 @@
 
   @override
   Future generateContent(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     buf.writeln('<table>');
     buf.writeln('<tr><th>Variable</th><th>Value</th></tr>');
     for (String key in Platform.environment.keys.toList()..sort()) {
@@ -810,6 +836,8 @@
       : super(site, '', '500 Oops', description: message);
 
   Future generateContent(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     p(trace.toString(), style: 'white-space: pre');
   }
 }
@@ -825,6 +853,8 @@
 
   @override
   Future generateContent(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (exceptions.isEmpty) {
       blankslate('No exceptions encountered!');
     } else {
@@ -847,6 +877,8 @@
 
   @override
   Future generateContent(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     final String issuesUrl = 'https://github.com/dart-lang/sdk/issues';
     p(
       'To file issues or feature requests, see our '
@@ -890,6 +922,8 @@
 
   @override
   Future generateContent(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     p(
         'Instrumentation can be enabled by starting the analysis server with the '
         '<code>--instrumentation-log-file=path/to/file</code> flag.',
@@ -932,6 +966,8 @@
 
   @override
   Future generateContent(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     UsageInfo usage = await profiler.getProcessUsage(pid);
 
     developer.ServiceProtocolInfo serviceProtocolInfo =
@@ -994,7 +1030,10 @@
   NotFoundPage(Site site, this.path)
       : super(site, '', '404 Not found', description: "'$path' not found.");
 
-  Future generateContent(Map<String, String> params) async {}
+  Future generateContent(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
+  }
 }
 
 class OverlaysPage extends DiagnosticPageWithNav {
@@ -1004,6 +1043,8 @@
 
   @override
   Future generateContent(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     FileContentOverlay overlays = server.fileContentOverlay;
     List<String> paths = overlays.paths.toList()..sort();
 
@@ -1047,6 +1088,8 @@
 
   @override
   Future generateContent(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     h3('Analysis plugins');
     List<PluginInfo> analysisPlugins = server.pluginManager.plugins;
 
@@ -1108,6 +1151,8 @@
 
   @override
   Future generateContent(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     h3('Profiling performance tag data');
 
     // prepare sorted tags
@@ -1242,6 +1287,8 @@
   }
 
   static Future<ServiceProtocol> connect(Uri uri) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     WebSocket socket = await WebSocket.connect(uri.toString());
     return new ServiceProtocol._(socket);
   }
@@ -1255,6 +1302,8 @@
 
   @override
   Future generateContent(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     DiagnosticsSite diagnosticsSite = site;
 
     buf.writeln('<div class="columns">');
@@ -1293,6 +1342,8 @@
 
   @override
   Future generateContent(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // server domain
     h3('Server domain subscriptions');
     ul(ServerService.VALUES, (item) {
diff --git a/pkg/analysis_server/lib/src/status/pages.dart b/pkg/analysis_server/lib/src/status/pages.dart
index 8105117..d13e0de 100644
--- a/pkg/analysis_server/lib/src/status/pages.dart
+++ b/pkg/analysis_server/lib/src/status/pages.dart
@@ -31,6 +31,8 @@
   String get path => '/$id';
 
   Future<Null> asyncDiv(void gen(), {String classes}) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (classes != null) {
       buf.writeln('<div class="$classes">');
     } else {
@@ -55,6 +57,8 @@
   }
 
   Future<String> generate(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     buf.clear();
     await generatePage(params);
     return buf.toString();
@@ -139,6 +143,8 @@
   Page createUnknownPage(String unknownPath);
 
   Future<Null> handleGetRequest(HttpRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     try {
       String path = request.uri.path;
 
@@ -174,6 +180,8 @@
 
   Future<Null> respond(HttpRequest request, Page page,
       [int code = HttpStatus.OK]) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     HttpResponse response = request.response;
     response.statusCode = code;
     response.headers.contentType = ContentType.HTML;
diff --git a/pkg/analysis_server/test/benchmarks_test.dart b/pkg/analysis_server/test/benchmarks_test.dart
index 5dd51fb..165760f 100644
--- a/pkg/analysis_server/test/benchmarks_test.dart
+++ b/pkg/analysis_server/test/benchmarks_test.dart
@@ -77,5 +77,5 @@
   );
   Map m = json.decode(result.stdout);
   List benchmarks = m['benchmarks'];
-  return benchmarks.map((b) => b['id']).toList();
+  return benchmarks.map((b) => b['id']).cast<String>().toList();
 }
diff --git a/pkg/analysis_server/test/integration/support/protocol_matchers.dart b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
index bdb6726..445d9fd 100644
--- a/pkg/analysis_server/test/integration/support/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
@@ -578,6 +578,8 @@
  *   DOCUMENTATION_COMMENT
  *   FILE_HEADER
  *   FUNCTION_BODY
+ *   INVOCATION
+ *   LITERAL
  * }
  */
 final Matcher isFoldingKind = new MatchesEnum("FoldingKind", [
@@ -586,7 +588,9 @@
   "DIRECTIVES",
   "DOCUMENTATION_COMMENT",
   "FILE_HEADER",
-  "FUNCTION_BODY"
+  "FUNCTION_BODY",
+  "INVOCATION",
+  "LITERAL"
 ]);
 
 /**
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
index 024e565..f47d69d 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
@@ -533,15 +533,17 @@
   }
 
   Future<E> performAnalysis<E>(int times, Completer<E> completer) async {
+    // Await a microtask. Otherwise the futures are chained and would
+    // resolve linearly using up the stack.
+    await null;
     if (completer.isCompleted) {
       return completer.future;
     }
     // We use a delayed future to allow microtask events to finish. The
-    // Future.value or Future() constructors use scheduleMicrotask themselves and
-    // would therefore not wait for microtask callbacks that are scheduled after
-    // invoking this method.
-    return new Future.delayed(
-        Duration.zero, () => performAnalysis(times - 1, completer));
+    // Future.value or Future.microtask() constructors use scheduleMicrotask
+    // themselves and would therefore not wait for microtask callbacks that
+    // are scheduled after invoking this method.
+    return new Future(() => performAnalysis(times - 1, completer));
   }
 
   void resolveSource(String path, String content) {
diff --git a/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart b/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
index 0573853..55a9cff 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
@@ -231,6 +231,54 @@
 ''');
   }
 
+  test_expression_selection() async {
+    addFlutterPackage();
+    await indexTestUnit('''
+import 'package:flutter/material.dart';
+
+Widget main() {
+  return new Container();
+}
+''');
+
+    Future<void> assertResult(String str) async {
+      int offset = findOffset(str);
+      _createRefactoring(offset, str.length);
+
+      await _assertSuccessfulRefactoring('''
+import 'package:flutter/material.dart';
+
+Widget main() {
+  return new Test();
+}
+
+class Test extends StatelessWidget {
+  const Test({
+    Key key,
+  }) : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    return new Container();
+  }
+}
+''');
+    }
+
+    await assertResult('Container');
+    await assertResult('new Container');
+    await assertResult('new Container(');
+    await assertResult('new Container()');
+    await assertResult('new Container();');
+    await assertResult('taine');
+    await assertResult('tainer');
+    await assertResult('tainer(');
+    await assertResult('tainer()');
+    await assertResult('turn new Container');
+    await assertResult('return new Container()');
+    await assertResult('return new Container();');
+  }
+
   test_expression_topFunction() async {
     addFlutterPackage();
     await indexTestUnit('''
diff --git a/pkg/analysis_server/test/services/search/element_visitors_test.dart b/pkg/analysis_server/test/services/search/element_visitors_test.dart
new file mode 100644
index 0000000..ef2c208
--- /dev/null
+++ b/pkg/analysis_server/test/services/search/element_visitors_test.dart
@@ -0,0 +1,68 @@
+// 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/search/element_visitors.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../abstract_single_unit.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FindElementByNameOffsetTest);
+  });
+}
+
+@reflectiveTest
+class FindElementByNameOffsetTest extends AbstractSingleUnitTest {
+  test_class() async {
+    await resolveTestUnit(r'''
+class AAA {}
+class BBB {}
+''');
+    _assertElement(6, ElementKind.CLASS, 'AAA');
+    _assertElement(19, ElementKind.CLASS, 'BBB');
+  }
+
+  test_function() async {
+    await resolveTestUnit(r'''
+void aaa() {}
+void bbb() {}
+''');
+    _assertElement(5, ElementKind.FUNCTION, 'aaa');
+    _assertElement(19, ElementKind.FUNCTION, 'bbb');
+  }
+
+  test_null() async {
+    await resolveTestUnit(r'''
+class AAA {}
+class BBB {}
+''');
+    expect(findElementByNameOffset(null, 0), isNull);
+
+    expect(findElementByNameOffset(testUnitElement, 0), isNull);
+    expect(findElementByNameOffset(testUnitElement, 1), isNull);
+
+    expect(findElementByNameOffset(testUnitElement, 5), isNull);
+    expect(findElementByNameOffset(testUnitElement, 7), isNull);
+  }
+
+  test_topLevelVariable() async {
+    await resolveTestUnit(r'''
+int aaa, bbb;
+int ccc;
+''');
+    _assertElement(4, ElementKind.TOP_LEVEL_VARIABLE, 'aaa');
+    _assertElement(9, ElementKind.TOP_LEVEL_VARIABLE, 'bbb');
+    _assertElement(18, ElementKind.TOP_LEVEL_VARIABLE, 'ccc');
+  }
+
+  void _assertElement(int nameOffset, ElementKind kind, String name) {
+    var element = findElementByNameOffset(testUnitElement, nameOffset);
+    expect(element, isNotNull);
+    expect(element.kind, kind);
+    expect(element.name, name);
+  }
+}
diff --git a/pkg/analysis_server/test/services/search/test_all.dart b/pkg/analysis_server/test/services/search/test_all.dart
index 0bc46de88..eed01b8 100644
--- a/pkg/analysis_server/test/services/search/test_all.dart
+++ b/pkg/analysis_server/test/services/search/test_all.dart
@@ -4,6 +4,7 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'element_visitors_test.dart' as element_visitors;
 import 'hierarchy_test.dart' as hierarchy_test;
 import 'search_engine_test.dart' as search_engine_test;
 
@@ -12,6 +13,7 @@
  */
 main() {
   defineReflectiveSuite(() {
+    element_visitors.main();
     hierarchy_test.main();
     search_engine_test.main();
   }, name: 'search');
diff --git a/pkg/analysis_server/test/src/computer/folding_computer_test.dart b/pkg/analysis_server/test/src/computer/folding_computer_test.dart
index 55d864b..c301f7f 100644
--- a/pkg/analysis_server/test/src/computer/folding_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/folding_computer_test.dart
@@ -106,6 +106,119 @@
     _compareRegions(regions, content);
   }
 
+  test_invocations() async {
+    String content = """
+// Content before
+
+main() {/*1:INC*/
+  print(/*2:INC*/
+    "Hello, world!",
+  /*2:INC:INVOCATION*/);
+/*1:INC:FUNCTION_BODY*/}
+
+// Content after
+""";
+
+    final regions = await _computeRegions(content);
+    _compareRegions(regions, content);
+  }
+
+  test_function_expression_invocation() async {
+    String content = """
+// Content before
+
+getFunc() => (String a, String b) {/*1:INC*/
+  print(a);
+/*1:INC:FUNCTION_BODY*/};
+
+main2() {/*2:INC*/
+  getFunc()(/*3:INC*/
+    "one",
+    "two"
+  /*3:INC:INVOCATION*/);
+/*2:INC:FUNCTION_BODY*/}
+
+// Content after
+""";
+
+    final regions = await _computeRegions(content);
+    _compareRegions(regions, content);
+  }
+
+  test_constructor_invocations() async {
+    String content = """
+// Content before
+
+main() {/*1:INC*/
+  return new Text(/*2:INC*/
+    "Hello, world!",
+  /*2:INC:INVOCATION*/);
+/*1:INC:FUNCTION_BODY*/}
+
+// Content after
+""";
+
+    final regions = await _computeRegions(content);
+    _compareRegions(regions, content);
+  }
+
+  test_nested_invocations() async {
+    String content = """
+// Content before
+
+main() {/*1:INC*/
+  a(/*2:INC*/
+    b(/*3:INC*/
+      c(/*4:INC*/
+        d()
+      /*4:INC:INVOCATION*/),
+    /*3:INC:INVOCATION*/),
+  /*2:INC:INVOCATION*/);
+/*1:INC:FUNCTION_BODY*/}
+
+// Content after
+""";
+
+    final regions = await _computeRegions(content);
+    _compareRegions(regions, content);
+  }
+
+  test_literal_list() async {
+    String content = """
+// Content before
+
+main() {/*1:INC*/
+  final List<String> things = <String>[/*2:INC*/
+    "one",
+    "two"
+  /*2:INC:LITERAL*/];
+/*1:INC:FUNCTION_BODY*/}
+
+// Content after
+""";
+
+    final regions = await _computeRegions(content);
+    _compareRegions(regions, content);
+  }
+
+  test_literal_map() async {
+    String content = """
+// Content before
+
+main2() {/*1:INC*/
+  final Map<String, String> things = <String, String>{/*2:INC*/
+    "one": "one",
+    "two": "two"
+    /*2:INC:LITERAL*/};
+/*1:INC:FUNCTION_BODY*/}
+
+// Content after
+""";
+
+    final regions = await _computeRegions(content);
+    _compareRegions(regions, content);
+  }
+
   test_nested_function() async {
     String content = """
 // Content before
diff --git a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
index 2b8b4ac..4798194 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
@@ -150,8 +150,8 @@
 
   Future<Null> computeResult(String uri) {
     FileState file = fsState.getFileForUri(Uri.parse(uri));
-    AnalysisResult result = new AnalysisResult(
-        this, null, file.path, null, true, null, null, null, null, null, null);
+    AnalysisResult result = new AnalysisResult(this, null, file.path, null,
+        true, null, null, false, null, null, null, null);
     _resultController.add(result);
     return new Future.delayed(new Duration(milliseconds: 1));
   }
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/FoldingKind.java b/pkg/analysis_server/tool/spec/generated/java/types/FoldingKind.java
index e4fdb2e..161aa76 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/FoldingKind.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/FoldingKind.java
@@ -27,4 +27,8 @@
 
   public static final String FUNCTION_BODY = "FUNCTION_BODY";
 
+  public static final String INVOCATION = "INVOCATION";
+
+  public static final String LITERAL = "LITERAL";
+
 }
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index 7e8bc43..0173f12 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -7,7 +7,7 @@
 <body>
 <h1>Analysis Server API Specification</h1>
 <h1 style="color:#999999">Version
-  <version>1.20.3</version>
+  <version>1.20.4</version>
 </h1>
 <p>
   This document contains a specification of the API provided by the
diff --git a/pkg/analyzer/lib/dart/analysis/results.dart b/pkg/analyzer/lib/dart/analysis/results.dart
index 91fd27c..635fe97 100644
--- a/pkg/analyzer/lib/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/dart/analysis/results.dart
@@ -42,16 +42,11 @@
  *
  * Clients may not extend, implement or mix-in this class.
  */
-abstract class AnalysisResultWithErrors implements AnalysisResult {
+abstract class AnalysisResultWithErrors implements FileResult {
   /**
    * The analysis errors that were computed during analysis.
    */
   List<AnalysisError> get errors;
-
-  /**
-   * Information about lines in the content.
-   */
-  LineInfo get lineInfo;
 }
 
 /**
@@ -63,6 +58,24 @@
 abstract class ErrorsResult implements AnalysisResultWithErrors {}
 
 /**
+ * The result of computing some cheap information for a single file, when full
+ * parsed file is not required, so [ParseResult] is not necessary.
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+abstract class FileResult implements AnalysisResult {
+  /**
+   * Whether the file is a part.
+   */
+  bool get isPart;
+
+  /**
+   * Information about lines in the content.
+   */
+  LineInfo get lineInfo;
+}
+
+/**
  * The result of parsing of a single file. The errors returned include only
  * those discovered during scanning and parsing.
  *
diff --git a/pkg/analyzer/lib/dart/analysis/session.dart b/pkg/analyzer/lib/dart/analysis/session.dart
index dd8c595..3c4d9cf 100644
--- a/pkg/analyzer/lib/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/dart/analysis/session.dart
@@ -5,6 +5,7 @@
 import 'dart:async';
 
 import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/analysis/uri_converter.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/file_system/file_system.dart';
@@ -29,7 +30,10 @@
 
   /**
    * Return the source factory used to resolve URIs.
+   *
+   * Deprecated: Use the methods on [uriConverter] instead.
    */
+  @deprecated
   SourceFactory get sourceFactory;
 
   /**
@@ -44,6 +48,11 @@
   Future<TypeSystem> get typeSystem;
 
   /**
+   * Return the URI converter used to convert between URI's and file paths.
+   */
+  UriConverter get uriConverter;
+
+  /**
    * Return a future that will complete with information about the errors
    * contained in the file with the given absolute, normalized [path].
    *
diff --git a/pkg/analyzer/lib/dart/analysis/uri_converter.dart b/pkg/analyzer/lib/dart/analysis/uri_converter.dart
new file mode 100644
index 0000000..ec1ed8d
--- /dev/null
+++ b/pkg/analyzer/lib/dart/analysis/uri_converter.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.
+
+/**
+ * A utility class used to convert between URIs and absolute file paths.
+ */
+abstract class UriConverter {
+  /**
+   * Return the URI that should be used to reference the file at the absolute
+   * [path], or `null` if there is no valid way to reference the file in this
+   * converter’s context. The file at that path is not required to exist.
+   *
+   * If a [containingPath] is provided and both the [path] and [containingPath]
+   * are within the root of this converter’s context, then the returned URI will
+   * be a relative path. Otherwise, the returned URI will be an absolute URI.
+   *
+   * Throws an `ArgumentError` if the [path] is `null` or is not a valid
+   * absolute file path.
+   */
+  Uri pathToUri(String path, {String containingPath});
+
+  /**
+   * Return the absolute path of the file to which the absolute [uri] resolves,
+   * or `null` if the [uri] cannot be resolved in this converter’s context.
+   *
+   * Throws an `ArgumentError` if the [uri] is `null` or is not an absolute URI.
+   */
+  String uriToPath(Uri uri);
+}
diff --git a/pkg/analyzer/lib/file_system/memory_file_system.dart b/pkg/analyzer/lib/file_system/memory_file_system.dart
index 0c5c8b6..ea86f5a 100644
--- a/pkg/analyzer/lib/file_system/memory_file_system.dart
+++ b/pkg/analyzer/lib/file_system/memory_file_system.dart
@@ -105,6 +105,8 @@
 
   @override
   Future<List<int>> getModificationTimes(List<Source> sources) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return sources.map((source) {
       String path = source.fullName;
       return _pathToTimestamp[path] ?? -1;
diff --git a/pkg/analyzer/lib/file_system/physical_file_system.dart b/pkg/analyzer/lib/file_system/physical_file_system.dart
index db86404..6d9ae48 100644
--- a/pkg/analyzer/lib/file_system/physical_file_system.dart
+++ b/pkg/analyzer/lib/file_system/physical_file_system.dart
@@ -79,7 +79,7 @@
   }
 
   @override
-  Context get pathContext => io.Platform.isWindows ? windows : posix;
+  Context get pathContext => context;
 
   @override
   File getFile(String path) {
@@ -95,6 +95,8 @@
 
   @override
   Future<List<int>> getModificationTimes(List<Source> sources) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<String> paths = sources.map((source) => source.fullName).toList();
     return _pathsToTimes(paths);
   }
diff --git a/pkg/analyzer/lib/instrumentation/file_instrumentation.dart b/pkg/analyzer/lib/instrumentation/file_instrumentation.dart
index fa3df82..1d42dfa 100644
--- a/pkg/analyzer/lib/instrumentation/file_instrumentation.dart
+++ b/pkg/analyzer/lib/instrumentation/file_instrumentation.dart
@@ -39,6 +39,8 @@
 
   @override
   Future shutdown() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     await _sink.close();
     _sink = null;
   }
diff --git a/pkg/analyzer/lib/instrumentation/instrumentation.dart b/pkg/analyzer/lib/instrumentation/instrumentation.dart
index 38bf416..dc04bf5 100644
--- a/pkg/analyzer/lib/instrumentation/instrumentation.dart
+++ b/pkg/analyzer/lib/instrumentation/instrumentation.dart
@@ -379,6 +379,8 @@
    * should be invoked on this instance after this method has been invoked.
    */
   Future shutdown() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (_instrumentationServer != null) {
       await _instrumentationServer.shutdown();
       _instrumentationServer = null;
@@ -473,6 +475,8 @@
 
   @override
   Future shutdown() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     for (InstrumentationServer server in _servers) {
       await server.shutdown();
     }
diff --git a/pkg/analyzer/lib/src/dart/analysis/ast_provider_driver.dart b/pkg/analyzer/lib/src/dart/analysis/ast_provider_driver.dart
index 8cd0efa..21c2297 100644
--- a/pkg/analyzer/lib/src/dart/analysis/ast_provider_driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/ast_provider_driver.dart
@@ -20,12 +20,16 @@
 
   @override
   Future<SimpleIdentifier> getParsedNameForElement(Element element) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     CompilationUnit unit = await getParsedUnitForElement(element);
     return _getNameNode(unit, element);
   }
 
   @override
   Future<CompilationUnit> getParsedUnitForElement(Element element) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String path = element.source.fullName;
     ParseResult parseResult = await driver.parseFile(path);
     return parseResult.unit;
@@ -33,12 +37,16 @@
 
   @override
   Future<SimpleIdentifier> getResolvedNameForElement(Element element) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     CompilationUnit unit = await getResolvedUnitForElement(element);
     return _getNameNode(unit, element);
   }
 
   @override
   Future<CompilationUnit> getResolvedUnitForElement(Element element) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String path = element.source.fullName;
     AnalysisResult analysisResult = await driver.getResult(path);
     return analysisResult?.unit;
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 763beda..df71b24 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -95,7 +95,7 @@
   /**
    * The version of data format, should be incremented on every format change.
    */
-  static const int DATA_VERSION = 60;
+  static const int DATA_VERSION = 61;
 
   /**
    * The number of exception contexts allowed to write. Once this field is
@@ -605,6 +605,7 @@
    */
   Future<void> discoverAvailableFiles() {
     _discoverAvailableFiles();
+    _scheduler.notify(this);
     return _discoverAvailableFilesTask.completer.future;
   }
 
@@ -642,6 +643,8 @@
    * interactive analysis, such as Analysis Server or its plugins.
    */
   Future<ErrorsResult> getErrors(String path) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     _throwIfNotAbsolutePath(path);
 
     // Ask the analysis result without unit, so return cached errors.
@@ -662,7 +665,7 @@
     }
 
     return new ErrorsResult(currentSession, path, analysisResult.uri,
-        analysisResult.lineInfo, analysisResult.errors);
+        analysisResult.lineInfo, analysisResult.isPart, analysisResult.errors);
   }
 
   /**
@@ -690,6 +693,18 @@
   }
 
   /**
+   * Return the [FileResult] for the Dart file with the given [path].
+   *
+   * The [path] must be absolute and normalized.
+   */
+  FileResult getFileSync(String path) {
+    _throwIfNotAbsolutePath(path);
+    FileState file = _fileTracker.verifyApiSignature(path);
+    return new FileResult(
+        _currentSession, path, file.uri, file.lineInfo, file.isPart);
+  }
+
+  /**
    * Return a [Future] that completes with the [AnalysisDriverUnitIndex] for
    * the file with the given [path], or with `null` if the file cannot be
    * analyzed.
@@ -713,6 +728,8 @@
    * store, or built for a file to which the given [uri] is resolved.
    */
   Future<LibraryElement> getLibraryByUri(String uri) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (_externalSummaries != null && _externalSummaries.hasUnlinkedUnit(uri)) {
       return LibraryContext.resynthesizeLibraryElement(analysisOptions,
           declaredVariables, sourceFactory, _externalSummaries, uri);
@@ -731,23 +748,6 @@
   }
 
   /**
-   * Return the cached [AnalysisDriverResolvedUnit] for the file with the given
-   * [file], or `null` if the cache does not contain this information.
-   */
-  AnalysisDriverResolvedUnit getResolvedUnitObject(FileState file) {
-    FileState library = file.isPart ? file.library : file;
-    if (library != null) {
-      String signature = _getResolvedUnitSignature(library, file);
-      String key = _getResolvedUnitKey(signature);
-      List<int> bytes = _byteStore.get(key);
-      if (bytes != null) {
-        return new AnalysisDriverResolvedUnit.fromBuffer(bytes);
-      }
-    }
-    return null;
-  }
-
-  /**
    * Return a [Future] that completes with a [AnalysisResult] for the Dart
    * file with the given [path]. If the file is not a Dart file or cannot
    * be analyzed, the [Future] completes with `null`.
@@ -801,6 +801,8 @@
    * The [path] must be absolute and normalized.
    */
   Future<SourceKind> getSourceKind(String path) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     _throwIfNotAbsolutePath(path);
     if (AnalysisEngine.isDartFileName(path)) {
       FileState file = _fsState.getFileForPath(path);
@@ -883,6 +885,8 @@
    * resolved unit).
    */
   Future<ParseResult> parseFile(String path) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return parseFileSync(path);
   }
 
@@ -903,11 +907,13 @@
     RecordingErrorListener listener = new RecordingErrorListener();
     CompilationUnit unit = file.parse(listener);
     return new ParseResult(currentSession, file.path, file.uri, file.content,
-        unit.lineInfo, unit, listener.errors);
+        file.lineInfo, file.isPart, unit, listener.errors);
   }
 
   @override
   Future<Null> performWork() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (_fileTracker.verifyChangedFilesIfNeeded()) {
       return;
     }
@@ -1194,6 +1200,8 @@
       {bool withUnit: false,
       bool asIsIfPartWithoutLibrary: false,
       bool skipIfSameSignature: false}) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     FileState file = _fsState.getFileForPath(path);
 
     // Prepare the library - the file itself, or the known library.
@@ -1230,6 +1238,8 @@
 
     // We need the fully resolved unit, or the result is not cached.
     return _logger.runAsync('Compute analysis result for $path', () async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       try {
         LibraryContext libraryContext;
         KernelContext kernelContext;
@@ -1316,6 +1326,8 @@
   }
 
   Future<AnalysisDriverUnitIndex> _computeIndex(String path) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AnalysisResult analysisResult = await _computeAnalysisResult(path,
         withUnit: false, asIsIfPartWithoutLibrary: true);
     return analysisResult._index;
@@ -1323,6 +1335,8 @@
 
   Future<UnitElementResult> _computeUnitElement(String path,
       {bool asIsIfPartWithoutLibrary: false}) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     FileState file = _fsState.getFileForPath(path);
 
     // Prepare the library - the file itself, or the known library.
@@ -1393,6 +1407,8 @@
   }
 
   Future<KernelContext> _createKernelContext(FileState library) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return await KernelContext.forSingleLibrary(
         library,
         _logger,
@@ -1426,6 +1442,8 @@
    * Return the context in which the [library] should be analyzed.
    */
   Future<LibraryContext> _createLibraryContext(FileState library) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     _testView.numOfCreatedLibraryContexts++;
     return new LibraryContext.forSingleLibrary(
         library,
@@ -1494,6 +1512,7 @@
         file.exists,
         content,
         file.lineInfo,
+        file.isPart,
         signature,
         resolvedUnit,
         errors,
@@ -1583,6 +1602,7 @@
         file.exists,
         null,
         file.lineInfo,
+        file.isPart,
         null,
         null,
         [
@@ -1939,6 +1959,8 @@
    * priority first.
    */
   Future<Null> _run() async {
+    // Give other microtasks the time to run before doing the analysis cycle.
+    await null;
     Stopwatch timer = new Stopwatch()..start();
     PerformanceLogSection analysisSection;
     while (true) {
@@ -2023,6 +2045,8 @@
 
   Future<SummaryDataStore> getSummaryStore(String libraryPath) async {
     FileState library = driver.fsState.getFileForPath(libraryPath);
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     LibraryContext libraryContext = await driver._createLibraryContext(library);
     try {
       return libraryContext.store;
@@ -2043,10 +2067,9 @@
  * Every result is independent, and is not guaranteed to be consistent with
  * any previously returned result, even inside of the same library.
  */
-class AnalysisResult extends BaseAnalysisResult
-    implements results.ResolveResult {
+class AnalysisResult extends FileResult implements results.ResolveResult {
   static final _UNCHANGED = new AnalysisResult(
-      null, null, null, null, null, null, null, null, null, null, null);
+      null, null, null, null, null, null, null, null, null, null, null, null);
 
   /**
    * The [AnalysisDriver] that produced this result.
@@ -2066,9 +2089,6 @@
   @override
   final String content;
 
-  @override
-  final LineInfo lineInfo;
-
   /**
    * The signature of the result based on the content of the file, and the
    * transitive closure of files imported and exported by the library of
@@ -2094,12 +2114,13 @@
       Uri uri,
       this.exists,
       this.content,
-      this.lineInfo,
+      LineInfo lineInfo,
+      bool isPart,
       this._signature,
       this.unit,
       this.errors,
       this._index)
-      : super(driver?.currentSession, path, uri);
+      : super(driver?.currentSession, path, uri, lineInfo, isPart);
 
   @override
   LibraryElement get libraryElement => unit.element.library;
@@ -2157,16 +2178,13 @@
  * to each other. But none of the results is guaranteed to be consistent with
  * the state of the files.
  */
-class ErrorsResult extends BaseAnalysisResult implements results.ErrorsResult {
-  @override
-  final LineInfo lineInfo;
-
+class ErrorsResult extends FileResult implements results.ErrorsResult {
   @override
   final List<AnalysisError> errors;
 
-  ErrorsResult(
-      AnalysisSession session, String path, Uri uri, this.lineInfo, this.errors)
-      : super(session, path, uri);
+  ErrorsResult(AnalysisSession session, String path, Uri uri, LineInfo lineInfo,
+      bool isPart, this.errors)
+      : super(session, path, uri, lineInfo, isPart);
 
   @override
   results.ResultState get state => results.ResultState.VALID;
@@ -2200,28 +2218,44 @@
 }
 
 /**
+ * The result of computing some cheap information for a single file, when full
+ * parsed file is not required, so [ParseResult] is not necessary.
+ */
+class FileResult extends BaseAnalysisResult implements results.FileResult {
+  @override
+  final LineInfo lineInfo;
+
+  @override
+  final bool isPart;
+
+  FileResult(
+      AnalysisSession session, String path, Uri uri, this.lineInfo, this.isPart)
+      : super(session, path, uri);
+
+  @override
+  results.ResultState get state => results.ResultState.VALID;
+}
+
+/**
  * The result of parsing of a single file.
  *
  * These results are self-consistent, i.e. [content], [lineInfo], the
  * parsed [unit] correspond to each other. But none of the results is
  * guaranteed to be consistent with the state of the files.
  */
-class ParseResult extends BaseAnalysisResult implements results.ParseResult {
+class ParseResult extends FileResult implements results.ParseResult {
   @override
   final String content;
 
   @override
-  final LineInfo lineInfo;
-
-  @override
   final CompilationUnit unit;
 
   @override
   final List<AnalysisError> errors;
 
   ParseResult(AnalysisSession session, String path, Uri uri, this.content,
-      this.lineInfo, this.unit, this.errors)
-      : super(session, path, uri);
+      LineInfo lineInfo, bool isPart, this.unit, this.errors)
+      : super(session, path, uri, lineInfo, isPart);
 
   @override
   results.ResultState get state => results.ResultState.VALID;
diff --git a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
index ba59397..8cfdda3 100644
--- a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
@@ -223,12 +223,16 @@
     }
 
     return _runWithFrontEndContext('Compile', () async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       try {
         var dillTarget =
             new DillTarget(_options.ticker, uriTranslator, _options.target);
 
         // Append all libraries what we still have in the current component.
         await _logger.runAsync('Load dill libraries', () async {
+          // TODO(brianwilkerson) Determine whether this await is necessary.
+          await null;
           dillTarget.loader.appendLibraries(_component);
           await dillTarget.buildOutlines();
         });
@@ -240,6 +244,8 @@
 
         // Compile the entry point into the new component.
         _component = await _logger.runAsync('Compile', () async {
+          // TODO(brianwilkerson) Determine whether this await is necessary.
+          await null;
           await kernelTarget.buildOutlines(nameRoot: _component.root);
           return await kernelTarget.buildComponent() ?? _component;
         });
@@ -346,6 +352,8 @@
   }
 
   Future<T> _runWithFrontEndContext<T>(String msg, Future<T> f()) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return await CompilerContext.runWithOptions(_options, (context) {
       context.disableColors();
       return _logger.runAsync(msg, f);
@@ -488,17 +496,23 @@
 
   @override
   Future<bool> exists() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return file.exists;
   }
 
   @override
   Future<List<int>> readAsBytes() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // TODO(scheglov) Optimize.
     return utf8.encode(file.content);
   }
 
   @override
   Future<String> readAsString() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return file.content;
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart
index 9fd2e75..42792dc 100644
--- a/pkg/analyzer/lib/src/dart/analysis/index.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/index.dart
@@ -449,7 +449,8 @@
     // These functions are not bound to a source, we cannot index them.
     if (elementKind == ElementKind.PARAMETER &&
         element is ParameterElement &&
-        element.enclosingElement.isSynthetic) {
+        (element.enclosingElement == null ||
+            element.enclosingElement.isSynthetic)) {
       return;
     }
     // Add the relation.
diff --git a/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart b/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart
index 5079277..868599ed 100644
--- a/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart
@@ -78,7 +78,11 @@
       SourceFactory sourceFactory,
       FileSystemState fsState,
       FrontEndCompiler compiler) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return logger.runAsync('Create kernel context', () async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       Uri targetUri = targetLibrary.uri;
       LibraryCompilationResult compilationResult =
           await compiler.compile(targetUri);
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 0e6d519..a9090d2 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -96,7 +96,11 @@
    * Compute analysis results for all units of the library.
    */
   Future<Map<FileState, UnitAnalysisResult>> analyze() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return PerformanceStatistics.analysis.makeCurrentWhileAsync(() async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       if (_useCFE) {
         return await _analyze2();
       } else {
@@ -181,7 +185,11 @@
   }
 
   Future<Map<FileState, UnitAnalysisResult>> _analyze2() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return await _logger.runAsync('Analyze', () async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       Map<FileState, CompilationUnit> units = {};
 
       // Parse all files.
@@ -683,8 +691,8 @@
         .resolve(unit, unitElement);
 
     if (_libraryElement.context.analysisOptions.previewDart2) {
-      unit.accept(new AstRewriteVisitor(_libraryElement, source, _typeProvider,
-          AnalysisErrorListener.NULL_LISTENER));
+      unit.accept(new AstRewriteVisitor(_context.typeSystem, _libraryElement,
+          source, _typeProvider, AnalysisErrorListener.NULL_LISTENER));
     }
 
     // TODO(scheglov) remove EnumMemberBuilder class
@@ -737,8 +745,8 @@
         .resolve(unit, unitElement);
 
     if (_libraryElement.context.analysisOptions.previewDart2) {
-      unit.accept(new AstRewriteVisitor(_libraryElement, file.source,
-          _typeProvider, AnalysisErrorListener.NULL_LISTENER));
+      unit.accept(new AstRewriteVisitor(_context.typeSystem, _libraryElement,
+          file.source, _typeProvider, AnalysisErrorListener.NULL_LISTENER));
     }
 
     for (var declaration in unit.declarations) {
diff --git a/pkg/analyzer/lib/src/dart/analysis/mutex.dart b/pkg/analyzer/lib/src/dart/analysis/mutex.dart
index 562d56f..864e616 100644
--- a/pkg/analyzer/lib/src/dart/analysis/mutex.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/mutex.dart
@@ -24,6 +24,8 @@
   ///
   /// Returns a [Future] that will be completed when the lock has been acquired.
   Future<Null> acquire() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     while (_lock != null) {
       await _lock.future;
     }
@@ -32,6 +34,8 @@
 
   /// Run the given [criticalSection] with acquired mutex.
   Future<T> guard<T>(Future<T> criticalSection()) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     await acquire();
     try {
       return await criticalSection();
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index 1212bdc..d308de5 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -82,6 +82,8 @@
    * Returns class members with the given [name].
    */
   Future<List<Element>> classMembers(String name) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<Element> elements = <Element>[];
 
     void addElement(Element element) {
@@ -118,6 +120,8 @@
   Future<List<Declaration>> declarations(
       RegExp regExp, int maxResults, LinkedHashSet<String> files,
       {String onlyForFile}) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<Declaration> declarations = <Declaration>[];
 
     DeclarationKind getExecutableKind(
@@ -286,6 +290,8 @@
    */
   Future<List<SearchResult>> references(
       Element element, SearchedFiles searchedFiles) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (element == null) {
       return const <SearchResult>[];
     }
@@ -305,23 +311,24 @@
       return _searchReferences_Field(element, searchedFiles);
     } else if (kind == ElementKind.FUNCTION || kind == ElementKind.METHOD) {
       if (element.enclosingElement is ExecutableElement) {
-        return _searchReferences_Local(element, (n) => n is Block);
+        return _searchReferences_Local(
+            element, (n) => n is Block, searchedFiles);
       }
       return _searchReferences_Function(element, searchedFiles);
     } else if (kind == ElementKind.IMPORT) {
-      return _searchReferences_Import(element);
+      return _searchReferences_Import(element, searchedFiles);
     } else if (kind == ElementKind.LABEL ||
         kind == ElementKind.LOCAL_VARIABLE) {
-      return _searchReferences_Local(element, (n) => n is Block);
+      return _searchReferences_Local(element, (n) => n is Block, searchedFiles);
     } else if (kind == ElementKind.LIBRARY) {
-      return _searchReferences_Library(element);
+      return _searchReferences_Library(element, searchedFiles);
     } else if (kind == ElementKind.PARAMETER) {
       return _searchReferences_Parameter(element, searchedFiles);
     } else if (kind == ElementKind.PREFIX) {
-      return _searchReferences_Prefix(element);
+      return _searchReferences_Prefix(element, searchedFiles);
     } else if (kind == ElementKind.TYPE_PARAMETER) {
       return _searchReferences_Local(
-          element, (n) => n.parent is CompilationUnit);
+          element, (n) => n.parent is CompilationUnit, searchedFiles);
     }
     return const <SearchResult>[];
   }
@@ -335,6 +342,8 @@
    */
   Future<List<SearchResult>> subTypes(
       ClassElement type, SearchedFiles searchedFiles) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (type == null) {
       return const <SearchResult>[];
     }
@@ -352,6 +361,8 @@
    */
   Future<List<SubtypeResult>> subtypes(
       {ClassElement type, SubtypeResult subtype}) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String name;
     String id;
     if (type != null) {
@@ -366,13 +377,15 @@
       id = subtype.id;
     }
 
+    await _driver.discoverAvailableFiles();
+
     List<SubtypeResult> results = [];
-    for (String path in _driver.addedFiles) {
+    for (String path in _driver.knownFiles) {
       FileState file = _driver.fsState.getFileForPath(path);
       if (file.subtypedNames.contains(name)) {
-        AnalysisDriverResolvedUnit unit = _driver.getResolvedUnitObject(file);
-        if (unit != null) {
-          for (AnalysisDriverSubtype subtype in unit.index.subtypes) {
+        AnalysisDriverUnitIndex index = await _driver.getIndex(path);
+        if (index != null) {
+          for (AnalysisDriverSubtype subtype in index.subtypes) {
             if (subtype.supertypes.contains(id)) {
               FileState library = file.isPart ? file.library : file;
               results.add(new SubtypeResult(
@@ -393,6 +406,8 @@
    * Returns top-level elements with names matching the given [regExp].
    */
   Future<List<Element>> topLevelElements(RegExp regExp) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<Element> elements = <Element>[];
 
     void addElement(Element element) {
@@ -422,6 +437,8 @@
    */
   Future<List<SearchResult>> unresolvedMemberReferences(
       String name, SearchedFiles searchedFiles) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (name == null) {
       return const <SearchResult>[];
     }
@@ -459,6 +476,8 @@
       Element element,
       SearchedFiles searchedFiles,
       Map<IndexRelationKind, SearchResultKind> relationToResultKind) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // Prepare the element name.
     String name = element.displayName;
     if (element is ConstructorElement) {
@@ -470,7 +489,7 @@
     String path = element.source.fullName;
     if (name.startsWith('_')) {
       String libraryPath = element.library.source.fullName;
-      if (_driver.addedFiles.contains(libraryPath)) {
+      if (searchedFiles.add(libraryPath, this)) {
         FileState library = _driver.fsState.getFileForPath(libraryPath);
         List<FileState> candidates = [library]..addAll(library.partedFiles);
         for (FileState file in candidates) {
@@ -502,6 +521,8 @@
       Element element,
       Map<IndexRelationKind, SearchResultKind> relationToResultKind,
       String file) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AnalysisDriverUnitIndex index = await _driver.getIndex(file);
     if (index != null) {
       _IndexRequest request = new _IndexRequest(index);
@@ -515,12 +536,16 @@
   }
 
   Future<CompilationUnitElement> _getUnitElement(String file) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     UnitElementResult result = await _driver.getUnitElement(file);
     return result?.element;
   }
 
   Future<List<SearchResult>> _searchReferences(
       Element element, SearchedFiles searchedFiles) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<SearchResult> results = <SearchResult>[];
     await _addResults(results, element, searchedFiles,
         const {IndexRelationKind.IS_REFERENCED_BY: SearchResultKind.REFERENCE});
@@ -529,6 +554,8 @@
 
   Future<List<SearchResult>> _searchReferences_CompilationUnit(
       CompilationUnitElement element) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String path = element.source.fullName;
 
     // If the path is not known, then the file is not referenced.
@@ -557,6 +584,8 @@
 
   Future<List<SearchResult>> _searchReferences_Field(
       PropertyInducingElement field, SearchedFiles searchedFiles) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<SearchResult> results = <SearchResult>[];
     PropertyAccessorElement getter = field.getter;
     PropertyAccessorElement setter = field.setter;
@@ -581,6 +610,8 @@
 
   Future<List<SearchResult>> _searchReferences_Function(
       Element element, SearchedFiles searchedFiles) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (element is Member) {
       element = (element as Member).baseElement;
     }
@@ -594,6 +625,8 @@
 
   Future<List<SearchResult>> _searchReferences_Getter(
       PropertyAccessorElement getter, SearchedFiles searchedFiles) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<SearchResult> results = <SearchResult>[];
     await _addResults(results, getter, searchedFiles, const {
       IndexRelationKind.IS_REFERENCED_BY: SearchResultKind.REFERENCE,
@@ -603,10 +636,11 @@
   }
 
   Future<List<SearchResult>> _searchReferences_Import(
-      ImportElement element) async {
-    // Search only in drivers to which the library was added.
+      ImportElement element, SearchedFiles searchedFiles) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String path = element.source.fullName;
-    if (!_driver.addedFiles.contains(path)) {
+    if (!searchedFiles.add(path, this)) {
       return const <SearchResult>[];
     }
 
@@ -624,10 +658,11 @@
   }
 
   Future<List<SearchResult>> _searchReferences_Library(
-      LibraryElement element) async {
-    // Search only in drivers to which the library with the prefix was added.
+      LibraryElement element, SearchedFiles searchedFiles) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String path = element.source.fullName;
-    if (!_driver.addedFiles.contains(path)) {
+    if (!searchedFiles.add(path, this)) {
       return const <SearchResult>[];
     }
 
@@ -651,10 +686,12 @@
     return results;
   }
 
-  Future<List<SearchResult>> _searchReferences_Local(
-      Element element, bool isRootNode(AstNode n)) async {
+  Future<List<SearchResult>> _searchReferences_Local(Element element,
+      bool isRootNode(AstNode n), SearchedFiles searchedFiles) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String path = element.source.fullName;
-    if (!_driver.addedFiles.contains(path)) {
+    if (!searchedFiles.add(path, this)) {
       return const <SearchResult>[];
     }
 
@@ -686,11 +723,17 @@
 
   Future<List<SearchResult>> _searchReferences_Parameter(
       ParameterElement parameter, SearchedFiles searchedFiles) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<SearchResult> results = <SearchResult>[];
-    results.addAll(await _searchReferences_Local(parameter, (AstNode node) {
-      AstNode parent = node.parent;
-      return parent is ClassDeclaration || parent is CompilationUnit;
-    }));
+    results.addAll(await _searchReferences_Local(
+      parameter,
+      (AstNode node) {
+        AstNode parent = node.parent;
+        return parent is ClassDeclaration || parent is CompilationUnit;
+      },
+      searchedFiles,
+    ));
     if (parameter.isOptional) {
       results.addAll(await _searchReferences(parameter, searchedFiles));
     }
@@ -698,10 +741,11 @@
   }
 
   Future<List<SearchResult>> _searchReferences_Prefix(
-      PrefixElement element) async {
-    // Search only in drivers to which the library with the prefix was added.
+      PrefixElement element, SearchedFiles searchedFiles) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String path = element.source.fullName;
-    if (!_driver.addedFiles.contains(path)) {
+    if (!searchedFiles.add(path, this)) {
       return const <SearchResult>[];
     }
 
@@ -1017,6 +1061,8 @@
       int elementId,
       Map<IndexRelationKind, SearchResultKind> relationToResultKind,
       Future<CompilationUnitElement> getEnclosingUnitElement()) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // Find the first usage of the element.
     int i = _findFirstOccurrence(index.usedElements, elementId);
     if (i == -1) {
@@ -1088,6 +1134,8 @@
       String name,
       Map<IndexRelationKind, SearchResultKind> relationToResultKind,
       Future<CompilationUnitElement> getEnclosingUnitElement()) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // Find the name identifier.
     int nameId = getStringId(name);
     if (nameId == -1) {
diff --git a/pkg/analyzer/lib/src/dart/analysis/session.dart b/pkg/analyzer/lib/src/dart/analysis/session.dart
index f627fa8..10d76e5 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session.dart
@@ -6,10 +6,12 @@
 
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer/dart/analysis/uri_converter.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart' as driver;
 import 'package:analyzer/src/dart/analysis/top_level_declaration.dart';
+import 'package:analyzer/src/dart/analysis/uri_converter.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 
@@ -33,6 +35,11 @@
   TypeSystem _typeSystem;
 
   /**
+   * The URI converter used to convert between URI's and file paths.
+   */
+  UriConverter _uriConverter;
+
+  /**
    * The cache of libraries for URIs.
    */
   final Map<String, LibraryElement> _uriToLibraryCache = {};
@@ -50,6 +57,8 @@
 
   @override
   Future<TypeProvider> get typeProvider async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     _checkConsistency();
     if (_typeProvider == null) {
       LibraryElement coreLibrary = await _driver.getLibraryByUri('dart:core');
@@ -61,6 +70,8 @@
 
   @override
   Future<TypeSystem> get typeSystem async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     _checkConsistency();
     if (_typeSystem == null) {
       if (_driver.analysisOptions.strongMode) {
@@ -73,6 +84,11 @@
   }
 
   @override
+  UriConverter get uriConverter {
+    return _uriConverter ??= new DriverBasedUriConverter(_driver);
+  }
+
+  @override
   Future<ErrorsResult> getErrors(String path) {
     _checkConsistency();
     return _driver.getErrors(path);
@@ -80,6 +96,8 @@
 
   @override
   Future<LibraryElement> getLibraryByUri(String uri) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     _checkConsistency();
     var libraryElement = _uriToLibraryCache[uri];
     if (libraryElement == null) {
@@ -91,6 +109,8 @@
 
   @override
   Future<ParseResult> getParsedAst(String path) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return getParsedAstSync(path);
   }
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/session_helper.dart b/pkg/analyzer/lib/src/dart/analysis/session_helper.dart
index 758fe29..e35ec6a 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session_helper.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session_helper.dart
@@ -21,6 +21,8 @@
   /// from the library with the given [libraryUri], or `null` if the library
   /// does not export a class with such name.
   Future<ClassElement> getClass(String libraryUri, String className) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var libraryElement = await session.getLibraryByUri(libraryUri);
     var element = libraryElement.exportNamespace.get(className);
     if (element is ClassElement) {
@@ -35,6 +37,8 @@
   /// library does not export a top-level accessor with such name.
   Future<PropertyAccessorElement> getTopLevelPropertyAccessor(
       String uri, String name) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var libraryElement = await session.getLibraryByUri(uri);
     var element = libraryElement.exportNamespace.get(name);
     if (element is PropertyAccessorElement) {
diff --git a/pkg/analyzer/lib/src/dart/analysis/status.dart b/pkg/analyzer/lib/src/dart/analysis/status.dart
index 5759b5e..cc2ad45 100644
--- a/pkg/analyzer/lib/src/dart/analysis/status.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/status.dart
@@ -43,6 +43,8 @@
    * Return a [Future] that completes when [notify] is called at least once.
    */
   Future<Null> get signal async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     await _completer.future;
     _completer = new Completer<Null>();
   }
diff --git a/pkg/analyzer/lib/src/dart/analysis/uri_converter.dart b/pkg/analyzer/lib/src/dart/analysis/uri_converter.dart
new file mode 100644
index 0000000..df11c02
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/analysis/uri_converter.dart
@@ -0,0 +1,47 @@
+// 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:analyzer/dart/analysis/uri_converter.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:path/src/context.dart';
+
+/**
+ * An implementation of a URI converter based on an analysis driver.
+ */
+class DriverBasedUriConverter implements UriConverter {
+  /**
+   * The driver associated with the context in which the conversion will occur.
+   */
+  final AnalysisDriver driver;
+
+  /**
+   * Initialize a newly created URI converter to use the given [context] and
+   * [driver] to perform the conversions.
+   */
+  DriverBasedUriConverter(this.driver);
+
+  @override
+  Uri pathToUri(String path, {String containingPath}) {
+    ResourceProvider provider = driver.resourceProvider;
+    if (containingPath != null) {
+      Context context = provider.pathContext;
+      String root = driver.contextRoot.root;
+      if (context.isWithin(root, path) &&
+          context.isWithin(root, containingPath)) {
+        String relativePath =
+            context.relative(path, from: context.dirname(containingPath));
+        if (context.isRelative(relativePath)) {
+          return new Uri.file(relativePath);
+        }
+      }
+    }
+    Source source = provider.getFile(path).createSource();
+    return driver.sourceFactory.restoreUri(source);
+  }
+
+  @override
+  String uriToPath(Uri uri) => driver.sourceFactory.forUri2(uri).fullName;
+}
diff --git a/pkg/analyzer/lib/src/dart/element/builder.dart b/pkg/analyzer/lib/src/dart/element/builder.dart
index ce9381b..e0101c1 100644
--- a/pkg/analyzer/lib/src/dart/element/builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/builder.dart
@@ -217,6 +217,7 @@
       constantField.isStatic = true;
       constantField.isConst = true;
       constantField.type = enumType;
+      constantField.metadata = _createElementAnnotations(constant.metadata);
       setElementDocumentationComment(constantField, constant);
       fields.add(constantField);
       new PropertyAccessorElementImpl_ImplicitGetter(constantField);
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 883fb08..a15908f 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -2101,6 +2101,19 @@
   }
 
   @override
+  List<ElementAnnotation> get metadata {
+    if (_kernel != null) {
+      _metadata ??=
+          enclosingUnit._kernelContext.buildAnnotations(_kernel.annotations);
+    }
+    if (_unlinkedEnumValue != null) {
+      return _metadata ??=
+          _buildAnnotations(enclosingUnit, _unlinkedEnumValue.annotations);
+    }
+    return super.metadata;
+  }
+
+  @override
   String get name {
     if (_kernelEnumValue != null) {
       return _kernelEnumValue.name.name;
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index e0a73ba..d9d126a 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -19,6 +19,27 @@
 import 'package:analyzer/src/summary/resynthesize.dart'
     show RecursiveInstantiateToBounds;
 
+/// Transforms the given [list] by applying [transform] to all its elements.
+///
+/// If no changes are made (i.e. the return value of [transform] is identical
+/// to its parameter each time it is invoked), the original list is returned.
+List<T> _transformOrShare<T>(List<T> list, T Function(T) transform) {
+  var length = list.length;
+  for (int i = 0; i < length; i++) {
+    var item = list[i];
+    var transformed = transform(item);
+    if (!identical(item, transformed)) {
+      var newList = list.toList();
+      newList[i] = transformed;
+      for (i++; i < length; i++) {
+        newList[i] = transform(list[i]);
+      }
+      return newList;
+    }
+  }
+  return list;
+}
+
 /**
  * Type of callbacks used by [DeferredFunctionTypeImpl].
  */
@@ -80,7 +101,7 @@
  * function type.
  */
 class CircularFunctionTypeImpl extends DynamicTypeImpl
-    implements FunctionTypeImpl {
+    implements _FunctionTypeImplLazy {
   CircularFunctionTypeImpl() : super._circular();
 
   @override
@@ -237,7 +258,7 @@
  * resynthesized from a summary.  The actual underlying element won't be
  * constructed until it's needed.
  */
-class DeferredFunctionTypeImpl extends FunctionTypeImpl {
+class DeferredFunctionTypeImpl extends _FunctionTypeImplLazy {
   /**
    * Callback which should be invoked when the element associated with this
    * function type is needed.
@@ -335,43 +356,7 @@
 /**
  * The type of a function, method, constructor, getter, or setter.
  */
-class FunctionTypeImpl extends TypeImpl implements FunctionType {
-  /**
-   * The list of [typeArguments].
-   */
-  List<DartType> _typeArguments;
-
-  /**
-   * The list of [typeParameters], if it has been computed already.  Otherwise
-   * `null`.
-   */
-  List<TypeParameterElement> _typeParameters;
-
-  /**
-   * The return type of the function, or `null` if the return type should be
-   * accessed through the element.
-   */
-  final DartType _returnType;
-
-  /**
-   * The parameters to the function, or `null` if the parameters should be
-   * accessed through the element.
-   */
-  final List<ParameterElement> _parameters;
-
-  /**
-   * True if this type is the result of instantiating type parameters (and thus
-   * any type parameters bound by the typedef should be considered part of
-   * [typeParameters] rather than [typeFormals]).
-   */
-  final bool _isInstantiated;
-
-  /**
-   * The set of typedefs which should not be expanded when exploring this type,
-   * to avoid creating infinite types in response to self-referential typedefs.
-   */
-  final List<FunctionTypeAliasElement> prunedTypedefs;
-
+abstract class FunctionTypeImpl extends TypeImpl implements FunctionType {
   /**
    * Initialize a newly created function type to be declared by the given
    * [element], and also initialize [typeArguments] to match the
@@ -381,7 +366,8 @@
     if (element is FunctionTypeAliasElement) {
       throw new StateError('Use FunctionTypeImpl.forTypedef for typedefs');
     }
-    return new FunctionTypeImpl._(element, null, null, null, null, null, false);
+    return new _FunctionTypeImplLazy._(
+        element, null, null, null, null, null, false);
   }
 
   /**
@@ -392,8 +378,8 @@
    */
   factory FunctionTypeImpl.forTypedef(FunctionTypeAliasElement element,
       {List<DartType> typeArguments}) {
-    return new FunctionTypeImpl._(element, element?.name, null, typeArguments,
-        null, null, typeArguments != null);
+    return new _FunctionTypeImplLazy._(element, element?.name, null,
+        typeArguments, null, null, typeArguments != null);
   }
 
   /**
@@ -454,30 +440,16 @@
     return function.type = new FunctionTypeImpl(function);
   }
 
-  /**
-   * Private constructor.
-   */
-  FunctionTypeImpl._(
-      FunctionTypedElement element,
-      String name,
-      this.prunedTypedefs,
-      this._typeArguments,
-      this._returnType,
-      this._parameters,
-      this._isInstantiated)
-      : _typeParameters = null,
-        super(element, name);
+  /// Creates a function type that's not associated with any element in the
+  /// element tree.
+  factory FunctionTypeImpl.synthetic(
+      DartType returnType,
+      List<TypeParameterElement> typeFormals,
+      List<ParameterElement> parameters) {
+    return new _FunctionTypeImplStrict._(returnType, typeFormals, parameters);
+  }
 
-  /**
-   * Return the base parameter elements of this function element.
-   */
-  List<ParameterElement> get baseParameters =>
-      _parameters ?? element.parameters;
-
-  /**
-   * Return the return type defined by this function's element.
-   */
-  DartType get baseReturnType => _returnType ?? element.returnType;
+  FunctionTypeImpl._(Element element, String name) : super(element, name);
 
   @deprecated
   @override
@@ -554,7 +526,7 @@
   /**
    * Return `true` if this type is the result of instantiating type parameters.
    */
-  bool get isInstantiated => _isInstantiated;
+  bool get isInstantiated;
 
   @override
   Map<String, DartType> get namedParameterTypes {
@@ -569,33 +541,7 @@
    * Determine the new set of typedefs which should be pruned when expanding
    * this function type.
    */
-  List<FunctionTypeAliasElement> get newPrune {
-    Element element = this.element;
-    if (element is GenericFunctionTypeElement) {
-      element = (element as GenericFunctionTypeElement).enclosingElement;
-    }
-    if (element is FunctionTypeAliasElement && !element.isSynthetic) {
-      // This typedef should be pruned, along with anything that was previously
-      // pruned.
-      if (prunedTypedefs == null) {
-        return <FunctionTypeAliasElement>[element];
-      } else {
-        return new List<FunctionTypeAliasElement>.from(prunedTypedefs)
-          ..add(element);
-      }
-    } else {
-      // This is not a typedef, so nothing additional needs to be pruned.
-      return prunedTypedefs;
-    }
-  }
-
-  @override
-  List<String> get normalParameterNames {
-    return baseParameters
-        .where((parameter) => parameter.isNotOptional)
-        .map((parameter) => parameter.name)
-        .toList();
-  }
+  List<FunctionTypeAliasElement> get newPrune;
 
   @override
   List<DartType> get normalParameterTypes {
@@ -607,14 +553,6 @@
   }
 
   @override
-  List<String> get optionalParameterNames {
-    return baseParameters
-        .where((parameter) => parameter.isOptionalPositional)
-        .map((parameter) => parameter.name)
-        .toList();
-  }
-
-  @override
   List<DartType> get optionalParameterTypes {
     List<DartType> types = <DartType>[];
     _forEachParameterType(ParameterKind.POSITIONAL, (name, type) {
@@ -623,135 +561,11 @@
     return types;
   }
 
-  @override
-  List<ParameterElement> get parameters {
-    List<ParameterElement> baseParameters = this.baseParameters;
-    // no parameters, quick return
-    int parameterCount = baseParameters.length;
-    if (parameterCount == 0) {
-      return baseParameters;
-    }
-
-    // create specialized parameters
-    var specializedParams = new List<ParameterElement>(parameterCount);
-
-    var parameterTypes = TypeParameterTypeImpl.getTypes(typeParameters);
-    for (int i = 0; i < parameterCount; i++) {
-      var parameter = baseParameters[i];
-      if (parameter?.type == null) {
-        specializedParams[i] = parameter;
-        continue;
-      }
-
-      // Check if parameter type depends on defining type type arguments, or
-      // if it needs to be pruned.
-
-      if (parameter is FieldFormalParameterElement) {
-        // TODO(jmesserly): this seems like it won't handle pruning correctly.
-        specializedParams[i] = new FieldFormalParameterMember(parameter, this);
-        continue;
-      }
-      var baseType = parameter.type as TypeImpl;
-      TypeImpl type;
-      if (typeArguments.isEmpty ||
-          typeArguments.length != typeParameters.length) {
-        type = baseType.pruned(newPrune);
-      } else {
-        type = baseType.substitute2(typeArguments, parameterTypes, newPrune);
-      }
-
-      specializedParams[i] = identical(type, baseType)
-          ? parameter
-          : new ParameterMember(parameter, this, type);
-    }
-    return specializedParams;
-  }
-
-  @override
-  DartType get returnType {
-    DartType baseReturnType = this.baseReturnType;
-    if (baseReturnType == null) {
-      // TODO(brianwilkerson) This is a patch. The return type should never be
-      // null and we need to understand why it is and fix it.
-      return DynamicTypeImpl.instance;
-    }
-    // If there are no arguments to substitute, or if the arguments size doesn't
-    // match the parameter size, return the base return type.
-    if (typeArguments.length == 0 ||
-        typeArguments.length != typeParameters.length) {
-      return (baseReturnType as TypeImpl).pruned(newPrune);
-    }
-    return (baseReturnType as TypeImpl).substitute2(typeArguments,
-        TypeParameterTypeImpl.getTypes(typeParameters), newPrune);
-  }
-
   /**
-   * A list containing the actual types of the type arguments.
+   * The set of typedefs which should not be expanded when exploring this type,
+   * to avoid creating infinite types in response to self-referential typedefs.
    */
-  List<DartType> get typeArguments {
-    if (_typeArguments == null) {
-      // TODO(jmesserly): reuse TypeParameterTypeImpl.getTypes once we can
-      // make it generic, which will allow it to return List<DartType> instead
-      // of List<TypeParameterType>.
-      if (typeParameters.isEmpty) {
-        _typeArguments = DartType.EMPTY_LIST;
-      } else {
-        _typeArguments = new List<DartType>.from(
-            typeParameters.map((t) => t.type),
-            growable: false);
-      }
-    }
-    return _typeArguments;
-  }
-
-  @override
-  List<TypeParameterElement> get typeFormals {
-    if (_isInstantiated || element == null) {
-      return TypeParameterElement.EMPTY_LIST;
-    }
-    List<TypeParameterElement> baseTypeFormals = element.typeParameters;
-    int formalCount = baseTypeFormals.length;
-    if (formalCount == 0) {
-      return TypeParameterElement.EMPTY_LIST;
-    }
-
-    // Create type formals with specialized bounds.
-    // For example `<U extends T>` where T comes from an outer scope.
-    return TypeParameterMember.from(baseTypeFormals, this);
-  }
-
-  @override
-  List<TypeParameterElement> get typeParameters {
-    if (_typeParameters == null) {
-      // Combine the generic type variables from all enclosing contexts, except
-      // for this generic function's type variables. Those variables are
-      // tracked in [boundTypeParameters].
-      _typeParameters = <TypeParameterElement>[];
-
-      Element e = element;
-      while (e != null) {
-        // If a static method, skip the enclosing class type parameters.
-        if (e is MethodElement && e.isStatic) {
-          e = e.enclosingElement;
-        }
-        e = e.enclosingElement;
-        if (e is TypeParameterizedElement) {
-          _typeParameters.addAll(e.typeParameters);
-        }
-      }
-
-      if (_isInstantiated) {
-        // Once the type has been instantiated, type parameters defined at the
-        // site of the declaration of the method are no longer considered part
-        // [boundTypeParameters]; they are part of [typeParameters].
-        List<TypeParameterElement> parametersToAdd = element?.typeParameters;
-        if (parametersToAdd != null) {
-          _typeParameters.addAll(parametersToAdd);
-        }
-      }
-    }
-    return _typeParameters;
-  }
+  List<FunctionTypeAliasElement> get prunedTypedefs;
 
   @override
   bool operator ==(Object object) {
@@ -763,8 +577,8 @@
       // To test this, we instantiate both types with the same (unique) type
       // variables, and see if the result is equal.
       if (typeFormals.isNotEmpty) {
-        List<DartType> freshVariables =
-            relateTypeFormals(this, object, (t, s, _, __) => t == s);
+        List<DartType> freshVariables = FunctionTypeImpl.relateTypeFormals(
+            this, object, (t, s, _, __) => t == s);
         if (freshVariables == null) {
           return false;
         }
@@ -901,30 +715,7 @@
   }
 
   @override
-  FunctionTypeImpl instantiate(List<DartType> argumentTypes) {
-    if (argumentTypes.length != typeFormals.length) {
-      throw new ArgumentError(
-          "argumentTypes.length (${argumentTypes.length}) != "
-          "typeFormals.length (${typeFormals.length})");
-    }
-    if (argumentTypes.isEmpty) {
-      return this;
-    }
-
-    // Given:
-    //     {U/T} <S> T -> S
-    // Where {U/T} represents the typeArguments (U) and typeParameters (T) list,
-    // and <S> represents the typeFormals.
-    //
-    // Now instantiate([V]), and the result should be:
-    //     {U/T, V/S} T -> S.
-    List<DartType> newTypeArgs = <DartType>[];
-    newTypeArgs.addAll(typeArguments);
-    newTypeArgs.addAll(argumentTypes);
-
-    return new FunctionTypeImpl._(element, name, prunedTypedefs, newTypeArgs,
-        _returnType, _parameters, true);
-  }
+  FunctionTypeImpl instantiate(List<DartType> argumentTypes);
 
   @override
   bool isAssignableTo(DartType type) {
@@ -943,8 +734,8 @@
       // To test this, we instantiate both types with the same (unique) type
       // variables, and see if the result is equal.
       if (typeFormals.isNotEmpty) {
-        List<DartType> freshVariables =
-            relateTypeFormals(this, other, (t, s, _, __) => t == s);
+        List<DartType> freshVariables = FunctionTypeImpl.relateTypeFormals(
+            this, other, (t, s, _, __) => t == s);
         if (freshVariables == null) {
           return false;
         }
@@ -967,7 +758,7 @@
       [bool withDynamic = false, Set<Element> visitedElements]) {
     // Note: visitedElements is only used for breaking recursion in the type
     // hierarchy; we don't use it when recursing into the function type.
-    return relate(
+    return FunctionTypeImpl.relate(
         this,
         type,
         (DartType t, DartType s) =>
@@ -978,7 +769,7 @@
   @override
   bool isSubtypeOf(DartType type) {
     var typeSystem = new TypeSystemImpl(null);
-    return relate(
+    return FunctionTypeImpl.relate(
         typeSystem.instantiateToBounds(this),
         typeSystem.instantiateToBounds(type),
         (DartType t, DartType s) => t.isAssignableTo(s),
@@ -986,48 +777,9 @@
   }
 
   @override
-  FunctionTypeImpl pruned(List<FunctionTypeAliasElement> prune) {
-    if (prune == null) {
-      return this;
-    } else if (prune.contains(element) ||
-        prune.contains(element.enclosingElement)) {
-      // Circularity found.  Prune the type declaration.
-      return new CircularFunctionTypeImpl();
-    } else {
-      // There should never be a reason to prune a type that has already been
-      // pruned, since pruning is only done when expanding a function type
-      // alias, and function type aliases are always expanded by starting with
-      // base types.
-      assert(this.prunedTypedefs == null);
-      List<DartType> typeArgs = typeArguments
-          .map((DartType t) => (t as TypeImpl).pruned(prune))
-          .toList(growable: false);
-      return new FunctionTypeImpl._(element, name, prune, typeArgs, _returnType,
-          _parameters, _isInstantiated);
-    }
-  }
-
-  @override
   FunctionType substitute2(
       List<DartType> argumentTypes, List<DartType> parameterTypes,
-      [List<FunctionTypeAliasElement> prune]) {
-    if (argumentTypes.length != parameterTypes.length) {
-      throw new ArgumentError(
-          "argumentTypes.length (${argumentTypes.length}) != parameterTypes.length (${parameterTypes.length})");
-    }
-    Element element = this.element;
-    if (prune != null && prune.contains(element)) {
-      // Circularity found.  Prune the type declaration.
-      return new CircularFunctionTypeImpl();
-    }
-    if (argumentTypes.length == 0) {
-      return this.pruned(prune);
-    }
-    List<DartType> typeArgs =
-        TypeImpl.substitute(typeArguments, argumentTypes, parameterTypes);
-    return new FunctionTypeImpl._(element, name, prune, typeArgs, _returnType,
-        _parameters, _isInstantiated);
-  }
+      [List<FunctionTypeAliasElement> prune]);
 
   @override
   FunctionTypeImpl substitute3(List<DartType> argumentTypes) =>
@@ -1038,31 +790,7 @@
    * and type after any type parameters have been applied.
    */
   void _forEachParameterType(
-      ParameterKind kind, callback(String name, DartType type)) {
-    List<ParameterElement> parameters = baseParameters;
-    if (parameters.isEmpty) {
-      return;
-    }
-
-    List<DartType> typeParameters =
-        TypeParameterTypeImpl.getTypes(this.typeParameters);
-    int length = parameters.length;
-    for (int i = 0; i < length; i++) {
-      ParameterElement parameter = parameters[i];
-      // ignore: deprecated_member_use
-      if (parameter.parameterKind == kind) {
-        TypeImpl type = parameter.type ?? DynamicTypeImpl.instance;
-        if (typeArguments.length != 0 &&
-            typeArguments.length == typeParameters.length) {
-          type = type.substitute2(typeArguments, typeParameters, newPrune);
-        } else {
-          type = type.pruned(newPrune);
-        }
-
-        callback(parameter.name, type);
-      }
-    }
-  }
+      ParameterKind kind, callback(String name, DartType type));
 
   void _freeVariablesInFunctionType(
       FunctionType type, Set<TypeParameterType> free) {
@@ -3150,3 +2878,480 @@
           [List<FunctionTypeAliasElement> prune]) =>
       this;
 }
+
+/**
+ * A [FunctionTypeImpl] that is lazily built from a [FunctionTypedElement] in
+ * the element model.
+ */
+class _FunctionTypeImplLazy extends FunctionTypeImpl {
+  /**
+   * The list of [typeArguments].
+   */
+  List<DartType> _typeArguments;
+
+  /**
+   * The list of [typeParameters], if it has been computed already.  Otherwise
+   * `null`.
+   */
+  List<TypeParameterElement> _typeParameters;
+
+  /**
+   * The return type of the function, or `null` if the return type should be
+   * accessed through the element.
+   */
+  final DartType _returnType;
+
+  /**
+   * The parameters to the function, or `null` if the parameters should be
+   * accessed through the element.
+   */
+  final List<ParameterElement> _parameters;
+
+  /**
+   * True if this type is the result of instantiating type parameters (and thus
+   * any type parameters bound by the typedef should be considered part of
+   * [typeParameters] rather than [typeFormals]).
+   */
+  final bool _isInstantiated;
+
+  @override
+  final List<FunctionTypeAliasElement> prunedTypedefs;
+
+  /**
+   * Private constructor.
+   */
+  _FunctionTypeImplLazy._(
+      FunctionTypedElement element,
+      String name,
+      this.prunedTypedefs,
+      this._typeArguments,
+      this._returnType,
+      this._parameters,
+      this._isInstantiated)
+      : _typeParameters = null,
+        super._(element, name);
+
+  /**
+   * Return the base parameter elements of this function element.
+   */
+  List<ParameterElement> get baseParameters =>
+      _parameters ?? element.parameters;
+
+  /**
+   * Return the return type defined by this function's element.
+   */
+  DartType get baseReturnType => _returnType ?? element.returnType;
+
+  @override
+  bool get isInstantiated => _isInstantiated;
+
+  @override
+  List<FunctionTypeAliasElement> get newPrune {
+    Element element = this.element;
+    if (element is GenericFunctionTypeElement) {
+      element = (element as GenericFunctionTypeElement).enclosingElement;
+    }
+    if (element is FunctionTypeAliasElement && !element.isSynthetic) {
+      // This typedef should be pruned, along with anything that was previously
+      // pruned.
+      if (prunedTypedefs == null) {
+        return <FunctionTypeAliasElement>[element];
+      } else {
+        return new List<FunctionTypeAliasElement>.from(prunedTypedefs)
+          ..add(element);
+      }
+    } else {
+      // This is not a typedef, so nothing additional needs to be pruned.
+      return prunedTypedefs;
+    }
+  }
+
+  @override
+  List<String> get normalParameterNames {
+    return baseParameters
+        .where((parameter) => parameter.isNotOptional)
+        .map((parameter) => parameter.name)
+        .toList();
+  }
+
+  @override
+  List<String> get optionalParameterNames {
+    return baseParameters
+        .where((parameter) => parameter.isOptionalPositional)
+        .map((parameter) => parameter.name)
+        .toList();
+  }
+
+  @override
+  List<ParameterElement> get parameters {
+    List<ParameterElement> baseParameters = this.baseParameters;
+    // no parameters, quick return
+    int parameterCount = baseParameters.length;
+    if (parameterCount == 0) {
+      return baseParameters;
+    }
+
+    // create specialized parameters
+    var specializedParams = new List<ParameterElement>(parameterCount);
+
+    var parameterTypes = TypeParameterTypeImpl.getTypes(typeParameters);
+    for (int i = 0; i < parameterCount; i++) {
+      var parameter = baseParameters[i];
+      if (parameter?.type == null) {
+        specializedParams[i] = parameter;
+        continue;
+      }
+
+      // Check if parameter type depends on defining type type arguments, or
+      // if it needs to be pruned.
+
+      if (parameter is FieldFormalParameterElement) {
+        // TODO(jmesserly): this seems like it won't handle pruning correctly.
+        specializedParams[i] = new FieldFormalParameterMember(parameter, this);
+        continue;
+      }
+      var baseType = parameter.type as TypeImpl;
+      TypeImpl type;
+      if (typeArguments.isEmpty ||
+          typeArguments.length != typeParameters.length) {
+        type = baseType.pruned(newPrune);
+      } else {
+        type = baseType.substitute2(typeArguments, parameterTypes, newPrune);
+      }
+
+      specializedParams[i] = identical(type, baseType)
+          ? parameter
+          : new ParameterMember(parameter, this, type);
+    }
+    return specializedParams;
+  }
+
+  @override
+  DartType get returnType {
+    DartType baseReturnType = this.baseReturnType;
+    if (baseReturnType == null) {
+      // TODO(brianwilkerson) This is a patch. The return type should never be
+      // null and we need to understand why it is and fix it.
+      return DynamicTypeImpl.instance;
+    }
+    // If there are no arguments to substitute, or if the arguments size doesn't
+    // match the parameter size, return the base return type.
+    if (typeArguments.length == 0 ||
+        typeArguments.length != typeParameters.length) {
+      return (baseReturnType as TypeImpl).pruned(newPrune);
+    }
+    return (baseReturnType as TypeImpl).substitute2(typeArguments,
+        TypeParameterTypeImpl.getTypes(typeParameters), newPrune);
+  }
+
+  /**
+   * A list containing the actual types of the type arguments.
+   */
+  List<DartType> get typeArguments {
+    if (_typeArguments == null) {
+      // TODO(jmesserly): reuse TypeParameterTypeImpl.getTypes once we can
+      // make it generic, which will allow it to return List<DartType> instead
+      // of List<TypeParameterType>.
+      if (typeParameters.isEmpty) {
+        _typeArguments = DartType.EMPTY_LIST;
+      } else {
+        _typeArguments = new List<DartType>.from(
+            typeParameters.map((t) => t.type),
+            growable: false);
+      }
+    }
+    return _typeArguments;
+  }
+
+  @override
+  List<TypeParameterElement> get typeFormals {
+    if (_isInstantiated || element == null) {
+      return TypeParameterElement.EMPTY_LIST;
+    }
+    List<TypeParameterElement> baseTypeFormals = element.typeParameters;
+    int formalCount = baseTypeFormals.length;
+    if (formalCount == 0) {
+      return TypeParameterElement.EMPTY_LIST;
+    }
+
+    // Create type formals with specialized bounds.
+    // For example `<U extends T>` where T comes from an outer scope.
+    return TypeParameterMember.from(baseTypeFormals, this);
+  }
+
+  @override
+  List<TypeParameterElement> get typeParameters {
+    if (_typeParameters == null) {
+      // Combine the generic type variables from all enclosing contexts, except
+      // for this generic function's type variables. Those variables are
+      // tracked in [boundTypeParameters].
+      _typeParameters = <TypeParameterElement>[];
+
+      Element e = element;
+      while (e != null) {
+        // If a static method, skip the enclosing class type parameters.
+        if (e is MethodElement && e.isStatic) {
+          e = e.enclosingElement;
+        }
+        e = e.enclosingElement;
+        if (e is TypeParameterizedElement) {
+          _typeParameters.addAll(e.typeParameters);
+        }
+      }
+
+      if (_isInstantiated) {
+        // Once the type has been instantiated, type parameters defined at the
+        // site of the declaration of the method are no longer considered part
+        // [boundTypeParameters]; they are part of [typeParameters].
+        List<TypeParameterElement> parametersToAdd = element?.typeParameters;
+        if (parametersToAdd != null) {
+          _typeParameters.addAll(parametersToAdd);
+        }
+      }
+    }
+    return _typeParameters;
+  }
+
+  @override
+  FunctionTypeImpl instantiate(List<DartType> argumentTypes) {
+    if (argumentTypes.length != typeFormals.length) {
+      throw new ArgumentError(
+          "argumentTypes.length (${argumentTypes.length}) != "
+          "typeFormals.length (${typeFormals.length})");
+    }
+    if (argumentTypes.isEmpty) {
+      return this;
+    }
+
+    // Given:
+    //     {U/T} <S> T -> S
+    // Where {U/T} represents the typeArguments (U) and typeParameters (T) list,
+    // and <S> represents the typeFormals.
+    //
+    // Now instantiate([V]), and the result should be:
+    //     {U/T, V/S} T -> S.
+    List<DartType> newTypeArgs = <DartType>[];
+    newTypeArgs.addAll(typeArguments);
+    newTypeArgs.addAll(argumentTypes);
+
+    return new _FunctionTypeImplLazy._(element, name, prunedTypedefs,
+        newTypeArgs, _returnType, _parameters, true);
+  }
+
+  @override
+  FunctionTypeImpl pruned(List<FunctionTypeAliasElement> prune) {
+    if (prune == null) {
+      return this;
+    } else if (prune.contains(element) ||
+        prune.contains(element.enclosingElement)) {
+      // Circularity found.  Prune the type declaration.
+      return new CircularFunctionTypeImpl();
+    } else {
+      // There should never be a reason to prune a type that has already been
+      // pruned, since pruning is only done when expanding a function type
+      // alias, and function type aliases are always expanded by starting with
+      // base types.
+      assert(this.prunedTypedefs == null);
+      List<DartType> typeArgs = typeArguments
+          .map((DartType t) => (t as TypeImpl).pruned(prune))
+          .toList(growable: false);
+      return new _FunctionTypeImplLazy._(element, name, prune, typeArgs,
+          _returnType, _parameters, _isInstantiated);
+    }
+  }
+
+  @override
+  FunctionType substitute2(
+      List<DartType> argumentTypes, List<DartType> parameterTypes,
+      [List<FunctionTypeAliasElement> prune]) {
+    if (argumentTypes.length != parameterTypes.length) {
+      throw new ArgumentError(
+          "argumentTypes.length (${argumentTypes.length}) != parameterTypes.length (${parameterTypes.length})");
+    }
+    Element element = this.element;
+    if (prune != null && prune.contains(element)) {
+      // Circularity found.  Prune the type declaration.
+      return new CircularFunctionTypeImpl();
+    }
+    if (argumentTypes.length == 0) {
+      return this.pruned(prune);
+    }
+    List<DartType> typeArgs =
+        TypeImpl.substitute(typeArguments, argumentTypes, parameterTypes);
+    return new _FunctionTypeImplLazy._(element, name, prune, typeArgs,
+        _returnType, _parameters, _isInstantiated);
+  }
+
+  @override
+  void _forEachParameterType(
+      ParameterKind kind, callback(String name, DartType type)) {
+    List<ParameterElement> parameters = baseParameters;
+    if (parameters.isEmpty) {
+      return;
+    }
+
+    List<DartType> typeParameters =
+        TypeParameterTypeImpl.getTypes(this.typeParameters);
+    int length = parameters.length;
+    for (int i = 0; i < length; i++) {
+      ParameterElement parameter = parameters[i];
+      // ignore: deprecated_member_use
+      if (parameter.parameterKind == kind) {
+        TypeImpl type = parameter.type ?? DynamicTypeImpl.instance;
+        if (typeArguments.length != 0 &&
+            typeArguments.length == typeParameters.length) {
+          type = type.substitute2(typeArguments, typeParameters, newPrune);
+        } else {
+          type = type.pruned(newPrune);
+        }
+
+        callback(parameter.name, type);
+      }
+    }
+  }
+}
+
+/// A [FunctionTypeImpl] that is not associated with any element in the element
+/// model.
+///
+/// In contrast to [_FunctionTypeImplLazy], all of the properties of a
+/// [_FunctionTypeImplStrict] are known at construction time.
+class _FunctionTypeImplStrict extends FunctionTypeImpl {
+  @override
+  final DartType returnType;
+
+  @override
+  final List<TypeParameterElement> typeFormals;
+
+  @override
+  final List<ParameterElement> parameters;
+
+  _FunctionTypeImplStrict._(this.returnType, this.typeFormals, this.parameters)
+      : super._(null, null);
+
+  @override
+  List<TypeParameterElement> get boundTypeParameters => typeFormals;
+
+  @override
+  bool get isInstantiated => throw new UnimplementedError('TODO(paulberry)');
+
+  @override
+  List<FunctionTypeAliasElement> get newPrune => const [];
+
+  @override
+  List<String> get normalParameterNames =>
+      parameters.where((p) => p.isNotOptional).map((p) => p.name).toList();
+
+  @override
+  List<String> get optionalParameterNames => parameters
+      .where((p) => p.isOptionalPositional)
+      .map((p) => p.name)
+      .toList();
+
+  @override
+  List<FunctionTypeAliasElement> get prunedTypedefs => const [];
+
+  @override
+  List<DartType> get typeArguments => const [] /*TODO(paulberry)*/;
+
+  @override
+  List<TypeParameterElement> get typeParameters => const [] /*TODO(paulberry)*/;
+
+  @override
+  FunctionTypeImpl instantiate(List<DartType> argumentTypes) {
+    if (argumentTypes.length != typeFormals.length) {
+      throw new ArgumentError(
+          "argumentTypes.length (${argumentTypes.length}) != "
+          "typeFormals.length (${typeFormals.length})");
+    }
+    if (argumentTypes.isEmpty) {
+      return this;
+    }
+    var parameterTypes = typeFormals.map((p) => p.type).toList();
+    ParameterElement transformParameter(ParameterElement p) {
+      var type = p.type;
+      var newType = type.substitute2(argumentTypes, parameterTypes);
+      if (identical(newType, type)) return p;
+      return new ParameterElementImpl.synthetic(
+          p.name,
+          newType,
+          // ignore: deprecated_member_use
+          p.parameterKind);
+    }
+
+    return new _FunctionTypeImplStrict._(
+        returnType.substitute2(argumentTypes, parameterTypes),
+        const [],
+        _transformOrShare(parameters, transformParameter));
+  }
+
+  @override
+  TypeImpl pruned(List<FunctionTypeAliasElement> prune) => this;
+
+  @override
+  FunctionType substitute2(
+      List<DartType> argumentTypes, List<DartType> parameterTypes,
+      [List<FunctionTypeAliasElement> prune]) {
+    if (argumentTypes.length != parameterTypes.length) {
+      throw new ArgumentError(
+          "argumentTypes.length (${argumentTypes.length}) != "
+          "parameterTypes.length (${parameterTypes.length})");
+    }
+    TypeParameterElement transformTypeFormal(TypeParameterElement p) {
+      var bound = p.bound;
+      var newBound = bound?.substitute2(argumentTypes, parameterTypes);
+      if (identical(bound, newBound)) return p;
+      var element = new TypeParameterElementImpl.synthetic(p.name);
+      element.bound = newBound;
+      element.type = new TypeParameterTypeImpl(element);
+      return element;
+    }
+
+    var newTypeFormals = _transformOrShare(typeFormals, transformTypeFormal);
+    List<DartType> typeFormalsArgumentTypes;
+    List<DartType> typeFormalsParameterTypes;
+    if (!identical(typeFormals, newTypeFormals)) {
+      typeFormalsArgumentTypes = newTypeFormals.map((p) => p.type).toList();
+      typeFormalsParameterTypes = typeFormals.map((p) => p.type).toList();
+    }
+    DartType transformType(DartType t) {
+      t = t.substitute2(argumentTypes, parameterTypes);
+      if (typeFormalsArgumentTypes != null) {
+        t = t.substitute2(typeFormalsArgumentTypes, typeFormalsParameterTypes);
+      }
+      return t;
+    }
+
+    ParameterElement transformParameter(ParameterElement p) {
+      var type = p.type;
+      var newType = transformType(type);
+      if (identical(newType, type)) return p;
+      return new ParameterElementImpl.synthetic(
+          p.name,
+          newType,
+          // ignore: deprecated_member_use
+          p.parameterKind);
+    }
+
+    var newReturnType = transformType(returnType);
+    var newParameters = _transformOrShare(parameters, transformParameter);
+    if (identical(returnType, newReturnType) &&
+        identical(typeFormals, newTypeFormals) &&
+        identical(parameters, newParameters)) {
+      return this;
+    }
+    return new _FunctionTypeImplStrict._(
+        newReturnType, newTypeFormals, newParameters);
+  }
+
+  @override
+  void _forEachParameterType(
+      ParameterKind kind, Function(String name, DartType type) callback) {
+    for (var parameter in parameters) {
+      // ignore: deprecated_member_use
+      if (parameter.parameterKind == kind) {
+        callback(parameter.name, parameter.type);
+      }
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 1d28718..2f76c16 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -157,6 +157,13 @@
   }
 
   @override
+  void endImplicitCreationExpression(Token token) {
+    debugEvent("ImplicitCreationExpression");
+
+    _handleInstanceCreation(null);
+  }
+
+  @override
   void endNewExpression(Token newKeyword) {
     assert(optional('new', newKeyword));
     debugEvent("NewExpression");
@@ -863,6 +870,7 @@
     push(ast.thisExpression(thisKeyword));
   }
 
+  @override
   void handleType(Token beginToken, Token endToken) {
     debugEvent("Type");
 
@@ -2057,7 +2065,8 @@
     }
 
     FormalParameterList parameters = pop();
-    ConstructorName constructorName = pop();
+    pop(); // Type parameters
+    Object constructorName = pop();
     _Modifiers modifiers = pop();
     List<Annotation> metadata = pop();
     Comment comment = _findComment(metadata, beginToken);
@@ -2067,7 +2076,7 @@
     SimpleIdentifier returnType;
     Token period;
     SimpleIdentifier name;
-    Identifier typeName = constructorName.type.name;
+    Identifier typeName = constructorName;
     if (typeName is SimpleIdentifier) {
       returnType = typeName;
     } else if (typeName is PrefixedIdentifier) {
@@ -2163,6 +2172,12 @@
   }
 
   @override
+  void beginTypeVariable(Token name) {
+    debugEvent("beginTypeVariable");
+    push(ast.simpleIdentifier(name, isDeclaration: true));
+  }
+
+  @override
   void endTypeVariable(Token token, Token extendsOrSuper) {
     // TODO(paulberry): set up scopes properly to resolve parameters and type
     // variables.  Note that this is tricky due to the handling of initializers
diff --git a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart b/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
index 4534573..7e08aa0 100644
--- a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
@@ -321,8 +321,8 @@
       node is VariableDeclarationStatement && node.variables != 1;
 
   @override
-  Label label(Token identifier, Token colon) =>
-      astFactory.label(astFactory.simpleIdentifier(identifier), colon);
+  Label label(Token identifier, Token colon) => astFactory.label(
+      astFactory.simpleIdentifier(identifier, isDeclaration: true), colon);
 
   @override
   Statement labeledStatement(
diff --git a/pkg/analyzer/lib/src/fasta/error_converter.dart b/pkg/analyzer/lib/src/fasta/error_converter.dart
index 7207018..8fd383e 100644
--- a/pkg/analyzer/lib/src/fasta/error_converter.dart
+++ b/pkg/analyzer/lib/src/fasta/error_converter.dart
@@ -349,6 +349,10 @@
         errorReporter?.reportErrorForOffset(
             StrongModeCode.INVALID_CAST_NEW_EXPR, offset, length);
         return;
+      case "INVALID_CONSTRUCTOR_NAME":
+        errorReporter?.reportErrorForOffset(
+            CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, offset, length);
+        return;
       case "INVALID_GENERIC_FUNCTION_TYPE":
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.INVALID_GENERIC_FUNCTION_TYPE, offset, length);
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
index 8b7ee76..27e5169 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
@@ -226,7 +226,8 @@
     }
     _walk(new ElementWalker.forClass(element), () {
       for (EnumConstantDeclaration constant in node.constants) {
-        _match(constant.name, _walker.getVariable());
+        VariableElement element = _match(constant.name, _walker.getVariable());
+        _resolveMetadata(node, constant.metadata, element);
       }
       _walker.getFunction(); // toString()
       super.visitEnumDeclaration(node);
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 858e83f..09d4a84 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -46,13 +46,19 @@
  */
 class AstRewriteVisitor extends ScopedVisitor {
   final bool addConstKeyword;
+  final TypeSystem typeSystem;
 
   /**
    * Initialize a newly created visitor.
    */
-  AstRewriteVisitor(LibraryElement definingLibrary, Source source,
-      TypeProvider typeProvider, AnalysisErrorListener errorListener,
-      {Scope nameScope, this.addConstKeyword: false})
+  AstRewriteVisitor(
+      this.typeSystem,
+      LibraryElement definingLibrary,
+      Source source,
+      TypeProvider typeProvider,
+      AnalysisErrorListener errorListener,
+      {Scope nameScope,
+      this.addConstKeyword: false})
       : super(definingLibrary, source, typeProvider, errorListener,
             nameScope: nameScope);
 
@@ -76,7 +82,6 @@
       }
       Element element = nameScope.lookup(methodName, definingLibrary);
       if (element is ClassElement) {
-        ConstructorElement constructorElement = element.unnamedConstructor;
         AstFactory astFactory = new AstFactoryImpl();
         TypeName typeName = astFactory.typeName(methodName, node.typeArguments);
         ConstructorName constructorName =
@@ -84,7 +89,9 @@
         InstanceCreationExpression instanceCreationExpression =
             astFactory.instanceCreationExpression(
                 _getKeyword(node), constructorName, node.argumentList);
-        DartType type = _getType(element, node.typeArguments);
+        InterfaceType type = _getType(element, node.typeArguments);
+        ConstructorElement constructorElement =
+            type.lookUpConstructor(null, definingLibrary);
         methodName.staticElement = element;
         methodName.staticType = type;
         typeName.type = type;
@@ -111,7 +118,9 @@
           InstanceCreationExpression instanceCreationExpression =
               astFactory.instanceCreationExpression(
                   _getKeyword(node), constructorName, node.argumentList);
-          DartType type = _getType(element, node.typeArguments);
+          InterfaceType type = _getType(element, node.typeArguments);
+          constructorElement =
+              type.lookUpConstructor(methodName.name, definingLibrary);
           methodName.staticElement = element;
           methodName.staticType = type;
           typeName.type = type;
@@ -129,8 +138,6 @@
             astFactory.simpleIdentifier(methodName.token));
         Element prefixedElement = nameScope.lookup(identifier, definingLibrary);
         if (prefixedElement is ClassElement) {
-          ConstructorElement constructorElement =
-              prefixedElement.unnamedConstructor;
           TypeName typeName = astFactory.typeName(
               astFactory.prefixedIdentifier(target, node.operator, methodName),
               node.typeArguments);
@@ -139,7 +146,9 @@
           InstanceCreationExpression instanceCreationExpression =
               astFactory.instanceCreationExpression(
                   _getKeyword(node), constructorName, node.argumentList);
-          DartType type = _getType(prefixedElement, node.typeArguments);
+          InterfaceType type = _getType(prefixedElement, node.typeArguments);
+          ConstructorElement constructorElement =
+              type.lookUpConstructor(null, definingLibrary);
           methodName.staticElement = element;
           methodName.staticType = type;
           typeName.type = type;
@@ -164,7 +173,9 @@
             InstanceCreationExpression instanceCreationExpression =
                 astFactory.instanceCreationExpression(
                     _getKeyword(node), constructorName, node.argumentList);
-            DartType type = _getType(element, node.typeArguments);
+            InterfaceType type = _getType(element, node.typeArguments);
+            constructorElement =
+                type.lookUpConstructor(methodName.name, definingLibrary);
             methodName.staticElement = element;
             methodName.staticType = type;
             typeName.type = type;
@@ -206,6 +217,8 @@
           .map((TypeParameterElement parameter) => parameter.type)
           .toList();
       type = type.substitute2(argumentTypes, parameterTypes);
+    } else if (typeArguments == null && typeParameters != null) {
+      type = typeSystem.instantiateToBounds(type);
     }
     return type;
   }
@@ -4164,6 +4177,37 @@
   }
 
   /**
+   * Report a [HintCode.DUPLICATE_SHOWN_HIDDEN_NAME] hint for each duplicate
+   * shown or hidden name.
+   *
+   * Only call this method after all of the compilation units have been visited
+   * by this visitor.
+   *
+   * @param errorReporter the error reporter used to report the set of
+   *          [HintCode.UNUSED_SHOWN_NAME] hints
+   */
+  void generateDuplicateShownHiddenNameHints(ErrorReporter reporter) {
+    _duplicateHiddenNamesMap.forEach(
+        (NamespaceDirective directive, List<SimpleIdentifier> identifiers) {
+      int length = identifiers.length;
+      for (int i = 0; i < length; i++) {
+        Identifier identifier = identifiers[i];
+        reporter.reportErrorForNode(
+            HintCode.DUPLICATE_HIDDEN_NAME, identifier, [identifier.name]);
+      }
+    });
+    _duplicateShownNamesMap.forEach(
+        (NamespaceDirective directive, List<SimpleIdentifier> identifiers) {
+      int length = identifiers.length;
+      for (int i = 0; i < length; i++) {
+        Identifier identifier = identifiers[i];
+        reporter.reportErrorForNode(
+            HintCode.DUPLICATE_SHOWN_NAME, identifier, [identifier.name]);
+      }
+    });
+  }
+
+  /**
    * Report an [HintCode.UNUSED_IMPORT] hint for each unused import.
    *
    * Only call this method after all of the compilation units have been visited by this visitor.
@@ -4217,37 +4261,6 @@
   }
 
   /**
-   * Report a [HintCode.DUPLICATE_SHOWN_HIDDEN_NAME] hint for each duplicate
-   * shown or hidden name.
-   *
-   * Only call this method after all of the compilation units have been visited
-   * by this visitor.
-   *
-   * @param errorReporter the error reporter used to report the set of
-   *          [HintCode.UNUSED_SHOWN_NAME] hints
-   */
-  void generateDuplicateShownHiddenNameHints(ErrorReporter reporter) {
-    _duplicateHiddenNamesMap.forEach(
-        (NamespaceDirective directive, List<SimpleIdentifier> identifiers) {
-      int length = identifiers.length;
-      for (int i = 0; i < length; i++) {
-        Identifier identifier = identifiers[i];
-        reporter.reportErrorForNode(
-            HintCode.DUPLICATE_HIDDEN_NAME, identifier, [identifier.name]);
-      }
-    });
-    _duplicateShownNamesMap.forEach(
-        (NamespaceDirective directive, List<SimpleIdentifier> identifiers) {
-      int length = identifiers.length;
-      for (int i = 0; i < length; i++) {
-        Identifier identifier = identifiers[i];
-        reporter.reportErrorForNode(
-            HintCode.DUPLICATE_SHOWN_NAME, identifier, [identifier.name]);
-      }
-    });
-  }
-
-  /**
    * Remove elements from [_unusedImports] using the given [usedElements].
    */
   void removeUsedElements(UsedImportedElements usedElements) {
@@ -4291,26 +4304,6 @@
   }
 
   /**
-   * Add every shown name from [importDirective] into [_unusedShownNamesMap].
-   */
-  void _addShownNames(ImportDirective importDirective) {
-    if (importDirective.combinators == null) {
-      return;
-    }
-    List<SimpleIdentifier> identifiers = new List<SimpleIdentifier>();
-    _unusedShownNamesMap[importDirective] = identifiers;
-    for (Combinator combinator in importDirective.combinators) {
-      if (combinator is ShowCombinator) {
-        for (SimpleIdentifier name in combinator.shownNames) {
-          if (name.staticElement != null) {
-            identifiers.add(name);
-          }
-        }
-      }
-    }
-  }
-
-  /**
    * Add duplicate shown and hidden names from [directive] into
    * [_duplicateHiddenNamesMap] and [_duplicateShownNamesMap].
    */
@@ -4348,6 +4341,26 @@
   }
 
   /**
+   * Add every shown name from [importDirective] into [_unusedShownNamesMap].
+   */
+  void _addShownNames(ImportDirective importDirective) {
+    if (importDirective.combinators == null) {
+      return;
+    }
+    List<SimpleIdentifier> identifiers = new List<SimpleIdentifier>();
+    _unusedShownNamesMap[importDirective] = identifiers;
+    for (Combinator combinator in importDirective.combinators) {
+      if (combinator is ShowCombinator) {
+        for (SimpleIdentifier name in combinator.shownNames) {
+          if (name.staticElement != null) {
+            identifiers.add(name);
+          }
+        }
+      }
+    }
+  }
+
+  /**
    * Lookup and return the [Namespace] from the [_namespaceMap].
    *
    * If the map does not have the computed namespace, compute it and cache it in the map. If
@@ -5876,6 +5889,7 @@
     if (node.metadata != null) {
       node.metadata.accept(this);
       ElementResolver.resolveMetadata(node);
+      node.constants.forEach(ElementResolver.resolveMetadata);
     }
     //
     // Continue the enum resolution.
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index ab376a1..5656daf 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -1628,12 +1628,8 @@
         return type;
       }
 
-      var function = new FunctionElementImpl(type.name, -1)
-        ..isSynthetic = true
-        ..returnType = newReturnType
-        ..shareTypeParameters(type.typeFormals)
-        ..parameters = newParameters;
-      return function.type = new FunctionTypeImpl(function);
+      return new FunctionTypeImpl.synthetic(
+          newReturnType, type.typeFormals, newParameters);
     }
     return type;
   }
diff --git a/pkg/analyzer/lib/src/generated/utilities_general.dart b/pkg/analyzer/lib/src/generated/utilities_general.dart
index 968cad3..5571721 100644
--- a/pkg/analyzer/lib/src/generated/utilities_general.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_general.dart
@@ -215,6 +215,8 @@
 
   @override
   Future<E> makeCurrentWhileAsync<E>(Future<E> f()) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     PerformanceTag prevTag = makeCurrent();
     try {
       return await f();
diff --git a/pkg/analyzer/lib/src/lint/analysis.dart b/pkg/analyzer/lib/src/lint/analysis.dart
index 006ccb6..744db6f 100644
--- a/pkg/analyzer/lib/src/lint/analysis.dart
+++ b/pkg/analyzer/lib/src/lint/analysis.dart
@@ -159,6 +159,8 @@
   }
 
   Future<List<AnalysisErrorInfo>> analyze(Iterable<io.File> files) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AnalysisEngine.instance.logger = new StdLogger();
 
     SourceFactory sourceFactory =
diff --git a/pkg/analyzer/lib/src/lint/linter.dart b/pkg/analyzer/lib/src/lint/linter.dart
index 92e25c4..e4fde6c 100644
--- a/pkg/analyzer/lib/src/lint/linter.dart
+++ b/pkg/analyzer/lib/src/lint/linter.dart
@@ -67,6 +67,8 @@
   DartLinter(this.options, {this.reporter: const PrintingReporter()});
 
   Future<Iterable<AnalysisErrorInfo>> lintFiles(List<File> files) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<AnalysisErrorInfo> errors = [];
     final lintDriver = new LintDriver(options);
     errors.addAll(await lintDriver.analyze(files.where((f) => isDartFile(f))));
@@ -377,6 +379,8 @@
 
   @override
   Future<Iterable<AnalysisErrorInfo>> lintFiles(List<File> files) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<AnalysisErrorInfo> errors = [];
     final lintDriver = new LintDriver(options);
     errors.addAll(await lintDriver.analyze(files.where((f) => isDartFile(f))));
diff --git a/pkg/analyzer/lib/src/lint/project.dart b/pkg/analyzer/lib/src/lint/project.dart
index 48fa64d..f87c70f 100644
--- a/pkg/analyzer/lib/src/lint/project.dart
+++ b/pkg/analyzer/lib/src/lint/project.dart
@@ -53,17 +53,6 @@
     _apiModel = new _ApiModel(driver, sources, root);
   }
 
-  /// Create an initialized Dart project for the corresponding [driver] and
-  /// [sources].
-  /// If a [dir] is unspecified the current working directory will be
-  /// used.
-  static Future<DartProject> create(AnalysisDriver driver, List<Source> sources,
-      {Directory dir}) async {
-    DartProject project = new DartProject._(driver, sources, dir: dir);
-    await project._apiModel._calculate();
-    return project;
-  }
-
   /// The project's name.
   ///
   /// Project names correspond to the package name as specified in the project's
@@ -91,6 +80,19 @@
     }
     return p.basename(root.path);
   }
+
+  /// Create an initialized Dart project for the corresponding [driver] and
+  /// [sources].
+  /// If a [dir] is unspecified the current working directory will be
+  /// used.
+  static Future<DartProject> create(AnalysisDriver driver, List<Source> sources,
+      {Directory dir}) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
+    DartProject project = new DartProject._(driver, sources, dir: dir);
+    await project._apiModel._calculate();
+    return project;
+  }
 }
 
 /// An object that can be used to visit Dart project structure.
@@ -121,6 +123,8 @@
   }
 
   _calculate() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (sources == null || sources.isEmpty) {
       return;
     }
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index fdf5e48..8916caf 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -7238,11 +7238,23 @@
 class UnlinkedEnumValueBuilder extends Object
     with _UnlinkedEnumValueMixin
     implements idl.UnlinkedEnumValue {
+  List<UnlinkedExprBuilder> _annotations;
   UnlinkedDocumentationCommentBuilder _documentationComment;
   String _name;
   int _nameOffset;
 
   @override
+  List<UnlinkedExprBuilder> get annotations =>
+      _annotations ??= <UnlinkedExprBuilder>[];
+
+  /**
+   * Annotations for this value.
+   */
+  void set annotations(List<UnlinkedExprBuilder> value) {
+    this._annotations = value;
+  }
+
+  @override
   UnlinkedDocumentationCommentBuilder get documentationComment =>
       _documentationComment;
 
@@ -7276,10 +7288,12 @@
   }
 
   UnlinkedEnumValueBuilder(
-      {UnlinkedDocumentationCommentBuilder documentationComment,
+      {List<UnlinkedExprBuilder> annotations,
+      UnlinkedDocumentationCommentBuilder documentationComment,
       String name,
       int nameOffset})
-      : _documentationComment = documentationComment,
+      : _annotations = annotations,
+        _documentationComment = documentationComment,
         _name = name,
         _nameOffset = nameOffset;
 
@@ -7287,6 +7301,7 @@
    * Flush [informative] data recursively.
    */
   void flushInformative() {
+    _annotations?.forEach((b) => b.flushInformative());
     _documentationComment = null;
     _nameOffset = null;
   }
@@ -7296,11 +7311,24 @@
    */
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addString(this._name ?? '');
+    if (this._annotations == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._annotations.length);
+      for (var x in this._annotations) {
+        x?.collectApiSignature(signature);
+      }
+    }
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
+    fb.Offset offset_annotations;
     fb.Offset offset_documentationComment;
     fb.Offset offset_name;
+    if (!(_annotations == null || _annotations.isEmpty)) {
+      offset_annotations = fbBuilder
+          .writeList(_annotations.map((b) => b.finish(fbBuilder)).toList());
+    }
     if (_documentationComment != null) {
       offset_documentationComment = _documentationComment.finish(fbBuilder);
     }
@@ -7308,6 +7336,9 @@
       offset_name = fbBuilder.writeString(_name);
     }
     fbBuilder.startTable();
+    if (offset_annotations != null) {
+      fbBuilder.addOffset(3, offset_annotations);
+    }
     if (offset_documentationComment != null) {
       fbBuilder.addOffset(2, offset_documentationComment);
     }
@@ -7337,11 +7368,20 @@
 
   _UnlinkedEnumValueImpl(this._bc, this._bcOffset);
 
+  List<idl.UnlinkedExpr> _annotations;
   idl.UnlinkedDocumentationComment _documentationComment;
   String _name;
   int _nameOffset;
 
   @override
+  List<idl.UnlinkedExpr> get annotations {
+    _annotations ??=
+        const fb.ListReader<idl.UnlinkedExpr>(const _UnlinkedExprReader())
+            .vTableGet(_bc, _bcOffset, 3, const <idl.UnlinkedExpr>[]);
+    return _annotations;
+  }
+
+  @override
   idl.UnlinkedDocumentationComment get documentationComment {
     _documentationComment ??= const _UnlinkedDocumentationCommentReader()
         .vTableGet(_bc, _bcOffset, 2, null);
@@ -7365,6 +7405,9 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
+    if (annotations.isNotEmpty)
+      _result["annotations"] =
+          annotations.map((_value) => _value.toJson()).toList();
     if (documentationComment != null)
       _result["documentationComment"] = documentationComment.toJson();
     if (name != '') _result["name"] = name;
@@ -7374,6 +7417,7 @@
 
   @override
   Map<String, Object> toMap() => {
+        "annotations": annotations,
         "documentationComment": documentationComment,
         "name": name,
         "nameOffset": nameOffset,
diff --git a/pkg/analyzer/lib/src/summary/format.fbs b/pkg/analyzer/lib/src/summary/format.fbs
index 2b752f0..54b21e9 100644
--- a/pkg/analyzer/lib/src/summary/format.fbs
+++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -2042,6 +2042,11 @@
  */
 table UnlinkedEnumValue {
   /**
+   * Annotations for this value.
+   */
+  annotations:[UnlinkedExpr] (id: 3);
+
+  /**
    * Documentation comment for the enum value, or `null` if there is no
    * documentation comment.
    */
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart
index 49b3d3e..343740b 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -1660,6 +1660,12 @@
  */
 abstract class UnlinkedEnumValue extends base.SummaryClass {
   /**
+   * Annotations for this value.
+   */
+  @Id(3)
+  List<UnlinkedExpr> get annotations;
+
+  /**
    * Documentation comment for the enum value, or `null` if there is no
    * documentation comment.
    */
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index 3c6353c..10656bd 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -2225,7 +2225,7 @@
     UnlinkedExpr unlinkedConst = unlinkedExecutable.bodyExpr;
     var errorListener = AnalysisErrorListener.NULL_LISTENER;
     var astRewriteVisitor = new AstRewriteVisitor(
-        library, unit.source, typeProvider, errorListener);
+        linker.typeSystem, library, unit.source, typeProvider, errorListener);
     // TODO(paulberry): Do we need to pass a nameScope to
     // resolverVisitor to get type variables to resolve properly?
     var resolverVisitor = new ResolverVisitor(
diff --git a/pkg/analyzer/lib/src/summary/resynthesize.dart b/pkg/analyzer/lib/src/summary/resynthesize.dart
index 170a534..5c72f8a 100644
--- a/pkg/analyzer/lib/src/summary/resynthesize.dart
+++ b/pkg/analyzer/lib/src/summary/resynthesize.dart
@@ -1600,8 +1600,12 @@
     var expression = new ExprBuilder(this, context, uc).build();
 
     if (expression != null && context.context.analysisOptions.previewDart2) {
-      astRewriteVisitor ??= new AstRewriteVisitor(libraryResynthesizer.library,
-          unit.source, typeProvider, AnalysisErrorListener.NULL_LISTENER,
+      astRewriteVisitor ??= new AstRewriteVisitor(
+          libraryResynthesizer.summaryResynthesizer.context.typeSystem,
+          libraryResynthesizer.library,
+          unit.source,
+          typeProvider,
+          AnalysisErrorListener.NULL_LISTENER,
           addConstKeyword: true);
       var container = astFactory.expressionStatement(expression, null);
       expression.accept(astRewriteVisitor);
diff --git a/pkg/analyzer/lib/src/summary/summarize_ast.dart b/pkg/analyzer/lib/src/summary/summarize_ast.dart
index ea0c328..156b98df 100644
--- a/pkg/analyzer/lib/src/summary/summarize_ast.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_ast.dart
@@ -580,6 +580,18 @@
   }
 
   /**
+   * Serialize an [EnumConstantDeclaration] into an [UnlinkedEnumValue].
+   */
+  UnlinkedEnumValueBuilder serializeEnumConstantDeclaration(
+      EnumConstantDeclaration node) {
+    return new UnlinkedEnumValueBuilder(
+        annotations: serializeAnnotations(node.metadata),
+        documentationComment: serializeDocumentation(node.documentationComment),
+        name: node.name.name,
+        nameOffset: node.name.offset);
+  }
+
+  /**
    * Serialize a [FunctionDeclaration] or [MethodDeclaration] into an
    * [UnlinkedExecutable].
    *
@@ -1134,13 +1146,7 @@
     UnlinkedEnumBuilder b = new UnlinkedEnumBuilder();
     b.name = node.name.name;
     b.nameOffset = node.name.offset;
-    b.values = node.constants
-        .map((EnumConstantDeclaration value) => new UnlinkedEnumValueBuilder(
-            documentationComment:
-                serializeDocumentation(value.documentationComment),
-            name: value.name.name,
-            nameOffset: value.name.offset))
-        .toList();
+    b.values = node.constants.map(serializeEnumConstantDeclaration).toList();
     b.documentationComment = serializeDocumentation(node.documentationComment);
     b.annotations = serializeAnnotations(node.metadata);
     b.codeRange = serializeCodeRange(node);
diff --git a/pkg/analyzer/lib/src/task/dart.dart b/pkg/analyzer/lib/src/task/dart.dart
index a1c7232..50ff551 100644
--- a/pkg/analyzer/lib/src/task/dart.dart
+++ b/pkg/analyzer/lib/src/task/dart.dart
@@ -5125,8 +5125,12 @@
     // Re-write the AST to handle the optional new and const feature.
     //
     if (library.context.analysisOptions.previewDart2) {
-      unit.accept(new AstRewriteVisitor(library, unit.element.source,
-          typeProvider, AnalysisErrorListener.NULL_LISTENER));
+      unit.accept(new AstRewriteVisitor(
+          context.typeSystem,
+          library,
+          unit.element.source,
+          typeProvider,
+          AnalysisErrorListener.NULL_LISTENER));
     }
     //
     // Record outputs.
diff --git a/pkg/analyzer/test/dart/element/builder_test.dart b/pkg/analyzer/test/dart/element/builder_test.dart
index 224a4ea..6d748aa 100644
--- a/pkg/analyzer/test/dart/element/builder_test.dart
+++ b/pkg/analyzer/test/dart/element/builder_test.dart
@@ -1293,6 +1293,13 @@
     checkMetadata(parameterElement);
   }
 
+  void test_metadata_visitEnumConstant() {
+    ElementHolder enumElement = buildElementsForText('enum E { @a v }');
+    FieldElement v = enumElement.enums[0].fields[0];
+    expect(v.name, 'v');
+    checkMetadata(v);
+  }
+
   void test_metadata_visitEnumDeclaration() {
     ClassElement classElement =
         buildElementsForText('@a enum E { v }').enums[0];
diff --git a/pkg/analyzer/test/file_system/physical_resource_provider_test.dart b/pkg/analyzer/test/file_system/physical_resource_provider_test.dart
index 913bb27..63554c8 100644
--- a/pkg/analyzer/test/file_system/physical_resource_provider_test.dart
+++ b/pkg/analyzer/test/file_system/physical_resource_provider_test.dart
@@ -658,7 +658,7 @@
       expect(changesReceived, hasLength(0));
       file.writeAsStringSync('contents 2');
       return _delayed(() {
-        expect(changesReceived, hasLength(1));
+        expect(changesReceived, anyOf(hasLength(1), hasLength(2)));
         expect(changesReceived[0].type, equals(ChangeType.MODIFY));
         expect(changesReceived[0].path, equals(path));
       });
diff --git a/pkg/analyzer/test/generated/declaration_resolver_test.dart b/pkg/analyzer/test/generated/declaration_resolver_test.dart
index 5809f09..6ad2446 100644
--- a/pkg/analyzer/test/generated/declaration_resolver_test.dart
+++ b/pkg/analyzer/test/generated/declaration_resolver_test.dart
@@ -95,6 +95,11 @@
     checkMetadata('E');
   }
 
+  test_metadata_enumDeclaration_constant() async {
+    await setupCode('enum E { @a v }');
+    checkMetadata('v');
+  }
+
   test_metadata_exportDirective() async {
     addNamedSource('/foo.dart', 'class C {}');
     await setupCode('@a export "foo.dart";');
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 73c2001..0724a03 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -3700,6 +3700,19 @@
     verify([source]);
   }
 
+  test_metadata_enumConstantDeclaration() async {
+    Source source = addSource(r'''
+const x = 1;
+enum E {
+  aaa,
+  @x
+  bbb
+}''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_methodDeclaration_scope_signature() async {
     Source source = addSource(r'''
 const app = 0;
@@ -4829,6 +4842,87 @@
     verify([source]);
   }
 
+  test_optionalNew_rewrite_instantiatesToBounds() async {
+    resetWith(
+        options: new AnalysisOptionsImpl()
+          ..previewDart2 = true
+          ..strongMode = true);
+    Source source = addSource(r'''
+import 'b.dart';
+
+@B.named1()
+@B.named2()
+@B.named3()
+@B.named4()
+@B.named5()
+@B.named6()
+@B.named7()
+@B.named8()
+main() {}
+''');
+    final aSource = addNamedSource("/a.dart", r'''
+class Unbounded<T> {
+  const Unbounded();
+  const Unbounded.named();
+}
+class Bounded<T extends String> {
+  const Bounded();
+  const Bounded.named();
+}
+''');
+    final bSource = addNamedSource("/b.dart", r'''
+import 'a.dart';
+import 'a.dart' as p;
+
+const unbounded1 = Unbounded();
+const unbounded2 = Unbounded.named();
+const unbounded3 = p.Unbounded();
+const unbounded4 = p.Unbounded.named();
+const bounded1 = Bounded();
+const bounded2 = Bounded.named();
+const bounded3 = p.Bounded();
+const bounded4 = p.Bounded.named();
+
+class B {
+  const B.named1({this.unbounded: unbounded1}) : bounded = null;
+  const B.named2({this.unbounded: unbounded2}) : bounded = null;
+  const B.named3({this.unbounded: unbounded3}) : bounded = null;
+  const B.named4({this.unbounded: unbounded4}) : bounded = null;
+  const B.named5({this.bounded: bounded1}) : unbounded = null;
+  const B.named6({this.bounded: bounded2}) : unbounded = null;
+  const B.named7({this.bounded: bounded3}) : unbounded = null;
+  const B.named8({this.bounded: bounded4}) : unbounded = null;
+
+  final Unbounded unbounded;
+  final Bounded bounded;
+}
+''');
+    final result = await computeAnalysisResult(source);
+    expect(result.unit.declarations, hasLength(1));
+    final mainDecl = result.unit.declarations[0];
+    expect(mainDecl.metadata, hasLength(8));
+    mainDecl.metadata.forEach((metadata) {
+      final value = metadata.elementAnnotation.computeConstantValue();
+      expect(value, isNotNull);
+      expect(value.type.toString(), 'B');
+      final unbounded = value.getField('unbounded');
+      final bounded = value.getField('bounded');
+      if (!unbounded.isNull) {
+        expect(bounded.isNull, true);
+        expect(unbounded.type.name, 'Unbounded');
+        expect(unbounded.type.typeArguments, hasLength(1));
+        expect(unbounded.type.typeArguments[0].isDynamic, isTrue);
+      } else {
+        expect(unbounded.isNull, true);
+        expect(bounded.type.name, 'Bounded');
+        expect(bounded.type.typeArguments, hasLength(1));
+        expect(bounded.type.typeArguments[0].name, 'String');
+      }
+    });
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_optionalParameterInOperator_required() async {
     Source source = addSource(r'''
 class A {
diff --git a/pkg/analyzer/test/generated/package_build_test.dart b/pkg/analyzer/test/generated/package_build_test.dart
index 96cecc3..47980a8 100644
--- a/pkg/analyzer/test/generated/package_build_test.dart
+++ b/pkg/analyzer/test/generated/package_build_test.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/generated/package_build.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:mockito/mockito.dart';
 import 'package:package_config/packages.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -20,11 +19,31 @@
   });
 }
 
-class MockContextBuilder extends Mock implements ContextBuilder {}
+class MockContextBuilder implements ContextBuilder {
+  Map<String, Packages> packagesMapMap = <String, Packages>{};
+  Map<Packages, Map<String, List<Folder>>> packagesToMapMap =
+      <Packages, Map<String, List<Folder>>>{};
 
-class MockPackages extends Mock implements Packages {}
+  Map<String, List<Folder>> convertPackagesToMap(Packages packages) =>
+      packagesToMapMap[packages];
 
-class MockUriResolver extends Mock implements UriResolver {}
+  Packages createPackageMap(String rootDirectoryPath) =>
+      packagesMapMap[rootDirectoryPath];
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+class MockPackages implements Packages {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+class MockUriResolver implements UriResolver {
+  Map<Uri, Source> resolveAbsoluteMap = {};
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) => resolveAbsoluteMap[uri];
+}
 
 @reflectiveTest
 class PackageBuildFileUriResolverTest extends _BaseTest {
@@ -35,12 +54,10 @@
     provider.newFolder(_p('/workspace/.dart_tool/build/generated/project/lib'));
     provider.newFileWithBytes(
         _p('/workspace/pubspec.yaml'), 'name: project'.codeUnits);
-    final ContextBuilder contextBuilder = new MockContextBuilder();
+    final MockContextBuilder contextBuilder = new MockContextBuilder();
     final Packages packages = new MockPackages();
-    when(contextBuilder.createPackageMap(_p('/workspace')))
-        .thenReturn(packages);
-    when(contextBuilder.convertPackagesToMap(packages))
-        .thenReturn({'project': []});
+    contextBuilder.packagesMapMap[_p('/workspace')] = packages;
+    contextBuilder.packagesToMapMap[packages] = {'project': []};
     workspace =
         PackageBuildWorkspace.find(provider, _p('/workspace'), contextBuilder);
     resolver = new PackageBuildFileUriResolver(workspace);
@@ -112,7 +129,7 @@
 class PackageBuildPackageUriResolverTest extends _BaseTest {
   PackageBuildWorkspace workspace;
   PackageBuildPackageUriResolver resolver;
-  UriResolver packageUriResolver;
+  MockUriResolver packageUriResolver;
 
   Uri addPackageSource(String path, String uriStr, {bool create: true}) {
     Uri uri = Uri.parse(uriStr);
@@ -120,7 +137,7 @@
         ? provider.newFile(_p(path), '')
         : provider.getResource(_p(path));
     final Source source = file.createSource(uri);
-    when(packageUriResolver.resolveAbsolute(uri)).thenReturn(source);
+    packageUriResolver.resolveAbsoluteMap[uri] = source;
     return uri;
   }
 
@@ -189,10 +206,8 @@
     }
     final contextBuilder = new MockContextBuilder();
     final packages = new MockPackages();
-    when(contextBuilder.createPackageMap(_p(workspacePath)))
-        .thenReturn(packages);
-    when(contextBuilder.convertPackagesToMap(packages))
-        .thenReturn({'project': []});
+    contextBuilder.packagesMapMap[_p(workspacePath)] = packages;
+    contextBuilder.packagesToMapMap[packages] = {'project': []};
     workspace =
         PackageBuildWorkspace.find(provider, _p(workspacePath), contextBuilder);
     packageUriResolver = new MockUriResolver();
@@ -463,8 +478,8 @@
     final contextBuilder = new MockContextBuilder();
     final packages = new MockPackages();
     final packageMap = new Map.fromIterable(packageNames, value: ((_) => []));
-    when(contextBuilder.createPackageMap(_p(root))).thenReturn(packages);
-    when(contextBuilder.convertPackagesToMap(packages)).thenReturn(packageMap);
+    contextBuilder.packagesMapMap[_p(root)] = packages;
+    contextBuilder.packagesToMapMap[packages] = packageMap;
     return PackageBuildWorkspace.find(provider, _p(root), contextBuilder);
   }
 }
diff --git a/pkg/analyzer/test/generated/parser_fasta_listener.dart b/pkg/analyzer/test/generated/parser_fasta_listener.dart
index 2d36b5a..a341ce7 100644
--- a/pkg/analyzer/test/generated/parser_fasta_listener.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_listener.dart
@@ -508,8 +508,8 @@
   }
 
   @override
-  void beginTypeVariable(Token token) {
-    super.beginTypeVariable(token);
+  void beginTypeVariable(Token name) {
+    super.beginTypeVariable(name);
     begin('TypeVariable');
   }
 
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index 48992b4..d5e8886 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -1326,18 +1326,6 @@
     with SimpleParserTestMixin {
   @override
   @failingTest
-  void test_parseInstanceCreation_noKeyword_noPrefix() {
-    super.test_parseInstanceCreation_noKeyword_noPrefix();
-  }
-
-  @override
-  @failingTest
-  void test_parseInstanceCreation_noKeyword_prefix() {
-    super.test_parseInstanceCreation_noKeyword_prefix();
-  }
-
-  @override
-  @failingTest
   void test_parseTypeParameterList_single() {
     // TODO(brianwilkerson) Does not use all tokens.
     super.test_parseTypeParameterList_single();
diff --git a/pkg/analyzer/test/generated/parser_forest_test.dart b/pkg/analyzer/test/generated/parser_forest_test.dart
index b1b4491..b0a2885 100644
--- a/pkg/analyzer/test/generated/parser_forest_test.dart
+++ b/pkg/analyzer/test/generated/parser_forest_test.dart
@@ -8,17 +8,19 @@
 import '../src/fasta/body_builder_test_helper.dart';
 import 'parser_test.dart';
 
-main() async {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(ClassMemberParserTest_Forest);
-    defineReflectiveTests(ComplexParserTest_Forest);
-    defineReflectiveTests(ErrorParserTest_Forest);
-    defineReflectiveTests(ExpressionParserTest_Forest);
-    defineReflectiveTests(FormalParameterParserTest_Forest);
-    defineReflectiveTests(RecoveryParserTest_Forest);
-    defineReflectiveTests(SimpleParserTest_Forest);
-    defineReflectiveTests(StatementParserTest_Forest);
-    defineReflectiveTests(TopLevelParserTest_Forest);
+main() {
+  return CompilerTestContext.runWithTestOptions((_) {
+    defineReflectiveSuite(() {
+      defineReflectiveTests(ClassMemberParserTest_Forest);
+      defineReflectiveTests(ComplexParserTest_Forest);
+      defineReflectiveTests(ErrorParserTest_Forest);
+      defineReflectiveTests(ExpressionParserTest_Forest);
+      defineReflectiveTests(FormalParameterParserTest_Forest);
+      defineReflectiveTests(RecoveryParserTest_Forest);
+      defineReflectiveTests(SimpleParserTest_Forest);
+      defineReflectiveTests(StatementParserTest_Forest);
+      defineReflectiveTests(TopLevelParserTest_Forest);
+    });
   });
 }
 
@@ -2832,11 +2834,6 @@
   }
 
   @failingTest
-  void test_parseExpression_assign_compound() {
-    super.test_parseExpression_assign_compound();
-  }
-
-  @failingTest
   void test_parseExpression_comparison() {
     super.test_parseExpression_comparison();
   }
@@ -5216,11 +5213,6 @@
   }
 
   @failingTest
-  void test_parseStatement_singleLabel() {
-    super.test_parseStatement_singleLabel();
-  }
-
-  @failingTest
   void test_parseSwitchStatement_case() {
     super.test_parseSwitchStatement_case();
   }
@@ -5971,21 +5963,11 @@
   }
 
   @failingTest
-  void test_parseFunctionDeclaration_functionWithTypeParameters_comment() {
-    super.test_parseFunctionDeclaration_functionWithTypeParameters_comment();
-  }
-
-  @failingTest
   void test_parseFunctionDeclaration_getter() {
     super.test_parseFunctionDeclaration_getter();
   }
 
   @failingTest
-  void test_parseFunctionDeclaration_getter_generic_comment_returnType() {
-    super.test_parseFunctionDeclaration_getter_generic_comment_returnType();
-  }
-
-  @failingTest
   void test_parseFunctionDeclaration_metadata() {
     super.test_parseFunctionDeclaration_metadata();
   }
diff --git a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
index 763d120..61abc60 100644
--- a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
@@ -275,18 +275,6 @@
   bool get useCFE => true;
 
   @override
-  test_dynamicObjectGetter_hashCode() async {
-    // Fails with non-kernel analyzer but works correctly with kernel.
-    await super.test_dynamicObjectGetter_hashCode();
-  }
-
-  @override
-  test_dynamicObjectMethod_toString() async {
-    // Fails with non-kernel analyzer but works correctly with kernel.
-    await super.test_dynamicObjectMethod_toString();
-  }
-
-  @override
   test_futureOr_promotion3() async {
     // Test passes even though the overridden method fails.
     await super.test_futureOr_promotion3();
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index ab24845..1414b83 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -2814,7 +2814,6 @@
     resetWith(options: options);
   }
 
-  @failingTest // https://github.com/dart-lang/sdk/issues/32173
   test_dynamicObjectGetter_hashCode() async {
     String code = r'''
 main() {
@@ -2823,10 +2822,9 @@
 }
 ''';
     await resolveTestUnit(code);
-    expectInitializerType('foo', 'dynamic', isNull);
+    expectInitializerType('foo', 'int', isNull);
   }
 
-  @failingTest // https://github.com/dart-lang/sdk/issues/32173
   test_dynamicObjectMethod_toString() async {
     String code = r'''
 main() {
@@ -2835,7 +2833,7 @@
 }
 ''';
     await resolveTestUnit(code);
-    expectInitializerType('foo', 'dynamic', isNull);
+    expectInitializerType('foo', 'String', isNull);
   }
 
   test_futureOr_promotion1() async {
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 3804ff6..30d31dd 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -1442,6 +1442,31 @@
     expect(files, isNot(contains(c)));
   }
 
+  test_getFileSync_library() async {
+    var path = _p('/test/lib/a.dart');
+    provider.newFile(path, '');
+    var file = driver.getFileSync(path);
+    expect(file.path, path);
+    expect(file.uri.toString(), 'package:test/a.dart');
+    expect(file.isPart, isFalse);
+  }
+
+  test_getFileSync_notAbsolutePath() async {
+    try {
+      driver.getFileSync('not_absolute.dart');
+      fail('ArgumentError expected.');
+    } on ArgumentError {}
+  }
+
+  test_getFileSync_part() async {
+    var path = _p('/test/lib/a.dart');
+    provider.newFile(path, 'part of lib;');
+    var file = driver.getFileSync(path);
+    expect(file.path, path);
+    expect(file.uri.toString(), 'package:test/a.dart');
+    expect(file.isPart, isTrue);
+  }
+
   test_getIndex() async {
     String content = r'''
 foo(int p) {}
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index ac55908..d667f0e 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -856,6 +856,31 @@
     await _verifyReferences(element, expected);
   }
 
+  test_searchReferences_ImportElement_noPrefix_inPackage() async {
+    testFile = _p('/aaa/lib/a.dart');
+    await _resolveTestUnit('''
+import 'dart:math' show max, PI, Random hide min;
+export 'dart:math' show max, PI, Random hide min;
+main() {
+  PI;
+  new Random();
+  max(1, 2);
+}
+Random bar() => null;
+''', addToDriver: false);
+    ImportElement element = testLibraryElement.imports[0];
+    Element mainElement = await _findElement('main');
+    Element barElement = await _findElement('bar');
+    var kind = SearchResultKind.REFERENCE;
+    var expected = [
+      _expectId(mainElement, kind, 'PI;', length: 0),
+      _expectId(mainElement, kind, 'Random();', length: 0),
+      _expectId(mainElement, kind, 'max(1, 2);', length: 0),
+      _expectId(barElement, kind, 'Random bar()', length: 0),
+    ];
+    await _verifyReferences(element, expected);
+  }
+
   test_searchReferences_ImportElement_withPrefix() async {
     await _resolveTestUnit('''
 import 'dart:math' as math show max, PI, Random hide min;
@@ -952,6 +977,32 @@
     await _verifyReferences(element, expected);
   }
 
+  test_searchReferences_LibraryElement_inPackage() async {
+    testFile = _p('/aaa/lib/a.dart');
+    var partPathA = _p('/aaa/lib/unitA.dart');
+    var partPathB = _p('/aaa/lib/unitB.dart');
+
+    var codeA = 'part of lib; // A';
+    var codeB = 'part of lib; // B';
+    provider.newFile(partPathA, codeA);
+    provider.newFile(partPathB, codeB);
+    await _resolveTestUnit('''
+library lib;
+part 'unitA.dart';
+part 'unitB.dart';
+''', addToDriver: false);
+    LibraryElement element = testLibraryElement;
+    CompilationUnitElement unitElementA = element.parts[0];
+    CompilationUnitElement unitElementB = element.parts[1];
+    var expected = [
+      new ExpectedResult(unitElementA, SearchResultKind.REFERENCE,
+          codeA.indexOf('lib; // A'), 'lib'.length),
+      new ExpectedResult(unitElementB, SearchResultKind.REFERENCE,
+          codeB.indexOf('lib; // B'), 'lib'.length),
+    ];
+    await _verifyReferences(element, expected);
+  }
+
   test_searchReferences_LocalVariableElement() async {
     await _resolveTestUnit(r'''
 main() {
@@ -973,7 +1024,7 @@
     await _verifyReferences(element, expected);
   }
 
-  test_searchReferences_localVariableElement_inForEachLoop() async {
+  test_searchReferences_LocalVariableElement_inForEachLoop() async {
     await _resolveTestUnit('''
 main() {
   for (var v in []) {
@@ -995,6 +1046,30 @@
     await _verifyReferences(element, expected);
   }
 
+  test_searchReferences_LocalVariableElement_inPackage() async {
+    testFile = _p('/aaa/lib/a.dart');
+
+    await _resolveTestUnit('''
+main() {
+  var v;
+  v = 1;
+  v += 2;
+  print(v);
+  v();
+}
+''', addToDriver: false);
+    Element element = findElementsByName(testUnit, 'v').single;
+    Element main = _findElement('main');
+
+    var expected = [
+      _expectId(main, SearchResultKind.WRITE, 'v = 1;'),
+      _expectId(main, SearchResultKind.READ_WRITE, 'v += 2;'),
+      _expectId(main, SearchResultKind.READ, 'v);'),
+      _expectId(main, SearchResultKind.INVOCATION, 'v();')
+    ];
+    await _verifyReferences(element, expected);
+  }
+
   test_searchReferences_MethodElement() async {
     await _resolveTestUnit('''
 class A {
@@ -1212,6 +1287,36 @@
     await _verifyReferences(element, expected);
   }
 
+  test_searchReferences_PrefixElement_inPackage() async {
+    testFile = _p('/aaa/lib/a.dart');
+    var partPath = _p('/aaa/lib/my_part.dart');
+
+    String partCode = r'''
+part of my_lib;
+ppp.Future c;
+''';
+    provider.newFile(partPath, partCode);
+    await _resolveTestUnit('''
+library my_lib;
+import 'dart:async' as ppp;
+part 'my_part.dart';
+main() {
+  ppp.Future a;
+  ppp.Stream b;
+}
+''', addToDriver: false);
+    PrefixElement element = _findElementAtString('ppp;');
+    Element main = _findElement('main');
+    Element c = findChildElement(testLibraryElement, 'c');
+    var expected = [
+      _expectId(main, SearchResultKind.REFERENCE, 'ppp.Future'),
+      _expectId(main, SearchResultKind.REFERENCE, 'ppp.Stream'),
+      new ExpectedResult(c, SearchResultKind.REFERENCE,
+          partCode.indexOf('ppp.Future c'), 'ppp'.length)
+    ];
+    await _verifyReferences(element, expected);
+  }
+
   test_searchReferences_private_declaredInDefiningUnit() async {
     String p1 = _p('$testProject/part1.dart');
     String p2 = _p('$testProject/part2.dart');
@@ -1294,6 +1399,40 @@
     await _verifyReferences(element, expected);
   }
 
+  test_searchReferences_private_inPackage() async {
+    testFile = _p('/aaa/lib/a.dart');
+    var p1 = _p('/aaa/lib/part1.dart');
+    var p2 = _p('/aaa/lib/part2.dart');
+
+    String code1 = 'part of lib; _C v1;';
+    String code2 = 'part of lib; _C v2;';
+
+    provider.newFile(p1, code1);
+    provider.newFile(p2, code2);
+
+    await _resolveTestUnit('''
+library lib;
+part 'part1.dart';
+part 'part2.dart';
+class _C {}
+_C v;
+''', addToDriver: false);
+
+    Element element = testUnitElement.types.single;
+    Element v = testUnitElement.topLevelVariables[0];
+    Element v1 = testLibraryElement.parts[0].topLevelVariables[0];
+    Element v2 = testLibraryElement.parts[1].topLevelVariables[0];
+    var expected = [
+      new ExpectedResult(
+          v, SearchResultKind.REFERENCE, testCode.indexOf('_C v;'), 2),
+      new ExpectedResult(
+          v1, SearchResultKind.REFERENCE, code1.indexOf('_C v1;'), 2),
+      new ExpectedResult(
+          v2, SearchResultKind.REFERENCE, code2.indexOf('_C v2;'), 2),
+    ];
+    await _verifyReferences(element, expected);
+  }
+
   test_searchReferences_PropertyAccessorElement_getter() async {
     await _resolveTestUnit('''
 class A {
@@ -1507,6 +1646,68 @@
     }
   }
 
+  test_subtypes_discover() async {
+    var pathT = _p('/test/lib/t.dart');
+    var pathA = _p('/aaa/lib/a.dart');
+    var pathB = _p('/bbb/lib/b.dart');
+
+    var tUri = 'package:test/t.dart';
+    var aUri = 'package:aaa/a.dart';
+    var bUri = 'package:bbb/b.dart';
+
+    provider.newFile(pathT, r'''
+import 'package:aaa/a.dart';
+
+class T1 extends A {
+  void method1() {}
+}
+
+class T2 extends A {
+  void method2() {}
+}
+''');
+
+    provider.newFile(pathB, r'''
+import 'package:aaa/a.dart';
+
+class B extends A {
+  void method1() {}
+}
+''');
+
+    provider.newFile(pathA, r'''
+class A {
+  void method1() {}
+  void method2() {}
+}
+''');
+
+    driver.addFile(pathT);
+
+    var aLibrary = await driver.getLibraryByUri(aUri);
+    ClassElement aClass = aLibrary.getType('A');
+
+    // Search by 'type'.
+    List<SubtypeResult> subtypes = await driver.search.subtypes(type: aClass);
+    expect(subtypes, hasLength(3));
+
+    SubtypeResult t1 = subtypes.singleWhere((r) => r.name == 'T1');
+    SubtypeResult t2 = subtypes.singleWhere((r) => r.name == 'T2');
+    SubtypeResult b = subtypes.singleWhere((r) => r.name == 'B');
+
+    expect(t1.libraryUri, tUri);
+    expect(t1.id, '$tUri;$tUri;T1');
+    expect(t1.members, ['method1']);
+
+    expect(t2.libraryUri, tUri);
+    expect(t2.id, '$tUri;$tUri;T2');
+    expect(t2.members, ['method2']);
+
+    expect(b.libraryUri, bUri);
+    expect(b.id, '$bUri;$bUri;B');
+    expect(b.members, ['method1']);
+  }
+
   test_subTypes_discover() async {
     var t = _p('/test/lib/t.dart');
     var a = _p('/aaa/lib/a.dart');
@@ -1672,8 +1873,13 @@
 
   String _p(String path) => provider.convertPath(path);
 
-  Future<Null> _resolveTestUnit(String code) async {
-    addTestFile(code);
+  Future<Null> _resolveTestUnit(String code, {bool addToDriver: true}) async {
+    if (addToDriver) {
+      addTestFile(code);
+    } else {
+      testCode = code;
+      provider.newFile(testFile, testCode);
+    }
     if (testUnit == null) {
       AnalysisResult result = await driver.getResult(testFile);
       testUnit = result.unit;
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index e518b96..0eab813 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -37,7 +37,7 @@
   }
 
   test_getErrors() async {
-    ErrorsResult result = new ErrorsResult(null, null, null, null, null);
+    ErrorsResult result = new ErrorsResult(null, null, null, null, null, null);
     driver.errorsResult = result;
     expect(await session.getErrors('path'), result);
   }
@@ -58,14 +58,14 @@
 
   test_getParsedAst() async {
     ParseResult result =
-        new ParseResult(null, null, null, null, null, null, null);
+        new ParseResult(null, null, null, null, null, null, null, null);
     driver.parseResult = result;
     expect(await session.getParsedAst('path'), result);
   }
 
   test_getResolvedAst() async {
-    AnalysisResult result = new AnalysisResult(
-        driver, null, null, null, null, null, null, null, null, null, null);
+    AnalysisResult result = new AnalysisResult(driver, null, null, null, null,
+        null, null, null, null, null, null, null);
     driver.result = result;
     expect(await session.getResolvedAst('path'), result);
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/test_all.dart b/pkg/analyzer/test/src/dart/analysis/test_all.dart
index f452ede..cd75df1 100644
--- a/pkg/analyzer/test/src/dart/analysis/test_all.dart
+++ b/pkg/analyzer/test/src/dart/analysis/test_all.dart
@@ -4,10 +4,10 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import 'context_builder_test.dart' as context_builder_test;
-import 'context_locator_test.dart' as context_locator_test;
-import 'context_root_test.dart' as context_root_test;
-import 'defined_names_test.dart' as defined_names_test;
+import 'context_builder_test.dart' as context_builder;
+import 'context_locator_test.dart' as context_locator;
+import 'context_root_test.dart' as context_root;
+import 'defined_names_test.dart' as defined_names;
 import 'driver_kernel_test.dart' as driver_kernel;
 import 'driver_resolution_kernel_test.dart' as driver_resolution_kernel;
 import 'driver_resolution_test.dart' as driver_resolution;
@@ -16,16 +16,17 @@
 import 'index_test.dart' as index;
 import 'mutex_test.dart' as mutex;
 import 'referenced_names_test.dart' as referenced_names;
-import 'search_test.dart' as search_test;
-import 'session_helper_test.dart' as session_helper_test;
-import 'session_test.dart' as session_test;
+import 'search_test.dart' as search;
+import 'session_helper_test.dart' as session_helper;
+import 'session_test.dart' as session;
+import 'uri_converter_test.dart' as uri_converter;
 
 main() {
   defineReflectiveSuite(() {
-    context_builder_test.main();
-    context_locator_test.main();
-    context_root_test.main();
-    defined_names_test.main();
+    context_builder.main();
+    context_locator.main();
+    context_root.main();
+    defined_names.main();
     driver.main();
     driver_kernel.main();
     driver_resolution.main();
@@ -34,8 +35,9 @@
     index.main();
     mutex.main();
     referenced_names.main();
-    search_test.main();
-    session_helper_test.main();
-    session_test.main();
+    search.main();
+    session_helper.main();
+    session.main();
+    uri_converter.main();
   }, name: 'analysis');
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/uri_converter_test.dart b/pkg/analyzer/test/src/dart/analysis/uri_converter_test.dart
new file mode 100644
index 0000000..f400cee
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/analysis/uri_converter_test.dart
@@ -0,0 +1,98 @@
+// 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:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/context/context_root.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/dart/analysis/uri_converter.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/source/package_map_resolver.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 '../../context/mock_sdk.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DriverBasedUriConverterTest);
+  });
+}
+
+@reflectiveTest
+class DriverBasedUriConverterTest extends Object with ResourceProviderMixin {
+  DriverBasedUriConverter uriConverter;
+
+  void setUp() {
+    resourceProvider = new MemoryResourceProvider();
+
+    Folder barFolder = newFolder('/packages/bar/lib');
+    Folder fooFolder = newFolder('/packages/foo/lib');
+
+    SourceFactory sourceFactory = new SourceFactory([
+      new DartUriResolver(new MockSdk(resourceProvider: resourceProvider)),
+      new PackageMapUriResolver(resourceProvider, {
+        'foo': [fooFolder],
+        'bar': [barFolder],
+      }),
+      new ResourceUriResolver(resourceProvider),
+    ], null, resourceProvider);
+
+    ContextRoot contextRoot = new ContextRoot(barFolder.path, [],
+        pathContext: resourceProvider.pathContext);
+
+    MockAnalysisDriver driver = new MockAnalysisDriver();
+    driver.resourceProvider = resourceProvider;
+    driver.sourceFactory = sourceFactory;
+    driver.contextRoot = contextRoot;
+
+    uriConverter = new DriverBasedUriConverter(driver);
+  }
+
+  test_pathToUri_dart() {
+    expect(uriConverter.pathToUri(convertPath('/sdk/lib/core/core.dart')),
+        Uri.parse('dart:core'));
+  }
+
+  test_pathToUri_notRelative() {
+    expect(
+        uriConverter.pathToUri(convertPath('/packages/foo/lib/foo.dart'),
+            containingPath: convertPath('/packages/bar/lib/bar.dart')),
+        Uri.parse('package:foo/foo.dart'));
+  }
+
+  test_pathToUri_package() {
+    expect(uriConverter.pathToUri(convertPath('/packages/foo/lib/foo.dart')),
+        Uri.parse('package:foo/foo.dart'));
+  }
+
+  test_pathToUri_relative() {
+    expect(
+        uriConverter.pathToUri(convertPath('/packages/bar/lib/src/baz.dart'),
+            containingPath: convertPath('/packages/bar/lib/bar.dart')),
+        Uri.parse('src/baz.dart'));
+  }
+
+  test_uriToPath_dart() {
+    expect(uriConverter.uriToPath(Uri.parse('dart:core')),
+        convertPath('/sdk/lib/core/core.dart'));
+  }
+
+  test_uriToPath_package() {
+    expect(uriConverter.uriToPath(Uri.parse('package:foo/foo.dart')),
+        convertPath('/packages/foo/lib/foo.dart'));
+  }
+}
+
+class MockAnalysisDriver implements AnalysisDriver {
+  ResourceProvider resourceProvider;
+  SourceFactory sourceFactory;
+  ContextRoot contextRoot;
+
+  @override
+  dynamic noSuchMethod(Invocation invocation) {
+    fail('Unexpected invocation of ${invocation.memberName}');
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/element/function_type_test.dart b/pkg/analyzer/test/src/dart/element/function_type_test.dart
index 8c1e001..5535b55 100644
--- a/pkg/analyzer/test/src/dart/element/function_type_test.dart
+++ b/pkg/analyzer/test/src/dart/element/function_type_test.dart
@@ -42,6 +42,8 @@
 
   final listType = _makeListType();
 
+  final intType = new InterfaceTypeImpl(new MockClassElement('int'));
+
   void basicChecks(FunctionType f,
       {element,
       displayName: '() → dynamic',
@@ -58,19 +60,23 @@
       name: isNull}) {
     // DartType properties
     expect(f.displayName, displayName, reason: 'displayName');
-    expect(f.element, element);
+    expect(f.element, element, reason: 'element');
     expect(f.name, name, reason: 'name');
     // ParameterizedType properties
     expect(f.typeArguments, typeArguments, reason: 'typeArguments');
     expect(f.typeParameters, typeParameters, reason: 'typeParameters');
     // FunctionType properties
-    expect(f.namedParameterTypes, namedParameterTypes);
+    expect(f.namedParameterTypes, namedParameterTypes,
+        reason: 'namedParameterTypes');
     expect(f.normalParameterNames, normalParameterNames,
         reason: 'normalParameterNames');
-    expect(f.normalParameterTypes, normalParameterTypes);
-    expect(f.optionalParameterNames, optionalParameterNames);
-    expect(f.optionalParameterTypes, optionalParameterTypes);
-    expect(f.parameters, parameters);
+    expect(f.normalParameterTypes, normalParameterTypes,
+        reason: 'normalParameterTypes');
+    expect(f.optionalParameterNames, optionalParameterNames,
+        reason: 'optionalParameterNames');
+    expect(f.optionalParameterTypes, optionalParameterTypes,
+        reason: 'optionalParameterTypes');
+    expect(f.parameters, parameters, reason: 'parameters');
     expect(f.returnType, returnType ?? same(dynamicType), reason: 'returnType');
     expect(f.typeFormals, typeFormals, reason: 'typeFormals');
   }
@@ -80,25 +86,6 @@
   DartType mapOf(DartType keyType, DartType valueType) =>
       mapType.instantiate([keyType, valueType]);
 
-  test_unnamedConstructor_nonTypedef_noTypeArguments() {
-    var e = new MockFunctionTypedElement();
-    FunctionType f = new FunctionTypeImpl(e);
-    basicChecks(f, element: same(e));
-  }
-
-  test_unnamedConstructor_nonTypedef_withTypeArguments() {
-    var t = new MockTypeParameterElement('T');
-    var c = new MockClassElement('C', typeParameters: [t]);
-    var e = new MockMethodElement(c, returnType: t.type);
-    FunctionType f = new FunctionTypeImpl(e);
-    basicChecks(f,
-        element: same(e),
-        typeArguments: [same(t.type)],
-        typeParameters: [same(t)],
-        displayName: '() → T',
-        returnType: same(t.type));
-  }
-
   test_forInstantiatedTypedef_bothTypeParameters() {
     var t = new MockTypeParameterElement('T');
     var u = new MockTypeParameterElement('U');
@@ -433,12 +420,219 @@
         typeParameters: [same(t)]);
   }
 
+  test_synthetic() {
+    FunctionType f = new FunctionTypeImpl.synthetic(dynamicType, [], []);
+    basicChecks(f, element: isNull);
+  }
+
+  test_synthetic_instantiate() {
+    // T Function<T>(T x)
+    var t = new MockTypeParameterElement('T');
+    var x = new MockParameterElement('x', type: t.type);
+    FunctionType f = new FunctionTypeImpl.synthetic(t.type, [t], [x]);
+    FunctionType instantiated = f.instantiate([objectType]);
+    basicChecks(instantiated,
+        element: isNull,
+        displayName: '(Object) → Object',
+        returnType: same(objectType),
+        normalParameterNames: ['x'],
+        normalParameterTypes: [same(objectType)],
+        parameters: hasLength(1));
+  }
+
+  test_synthetic_instantiate_argument_length_mismatch() {
+    // dynamic Function<T>()
+    var t = new MockTypeParameterElement('T');
+    FunctionType f = new FunctionTypeImpl.synthetic(dynamicType, [t], []);
+    expect(() => f.instantiate([]), throwsA(new isInstanceOf<ArgumentError>()));
+  }
+
+  test_synthetic_instantiate_no_type_formals() {
+    FunctionType f = new FunctionTypeImpl.synthetic(dynamicType, [], []);
+    expect(f.instantiate([]), same(f));
+  }
+
+  test_synthetic_instantiate_share_parameters() {
+    // T Function<T>(int x)
+    var t = new MockTypeParameterElement('T');
+    var x = new MockParameterElement('x', type: intType);
+    FunctionType f = new FunctionTypeImpl.synthetic(t.type, [t], [x]);
+    FunctionType instantiated = f.instantiate([objectType]);
+    basicChecks(instantiated,
+        element: isNull,
+        displayName: '(int) → Object',
+        returnType: same(objectType),
+        normalParameterNames: ['x'],
+        normalParameterTypes: [same(intType)],
+        parameters: same(f.parameters));
+  }
+
+  test_synthetic_namedParameter() {
+    var p = new MockParameterElement('x',
+        type: objectType, parameterKind: ParameterKind.NAMED);
+    FunctionType f = new FunctionTypeImpl.synthetic(dynamicType, [], [p]);
+    basicChecks(f,
+        element: isNull,
+        displayName: '({x: Object}) → dynamic',
+        namedParameterTypes: {'x': same(objectType)},
+        parameters: hasLength(1));
+    expect(f.parameters[0].isNamed, isTrue);
+    expect(f.parameters[0].name, 'x');
+    expect(f.parameters[0].type, same(objectType));
+  }
+
+  test_synthetic_normalParameter() {
+    var p = new MockParameterElement('x', type: objectType);
+    FunctionType f = new FunctionTypeImpl.synthetic(dynamicType, [], [p]);
+    basicChecks(f,
+        element: isNull,
+        displayName: '(Object) → dynamic',
+        normalParameterNames: ['x'],
+        normalParameterTypes: [same(objectType)],
+        parameters: hasLength(1));
+    expect(f.parameters[0].isNotOptional, isTrue);
+    expect(f.parameters[0].name, 'x');
+    expect(f.parameters[0].type, same(objectType));
+  }
+
+  test_synthetic_optionalParameter() {
+    var p = new MockParameterElement('x',
+        type: objectType, parameterKind: ParameterKind.POSITIONAL);
+    FunctionType f = new FunctionTypeImpl.synthetic(dynamicType, [], [p]);
+    basicChecks(f,
+        element: isNull,
+        displayName: '([Object]) → dynamic',
+        optionalParameterNames: ['x'],
+        optionalParameterTypes: [same(objectType)],
+        parameters: hasLength(1));
+    expect(f.parameters[0].isOptionalPositional, isTrue);
+    expect(f.parameters[0].name, 'x');
+    expect(f.parameters[0].type, same(objectType));
+  }
+
+  test_synthetic_returnType() {
+    FunctionType f = new FunctionTypeImpl.synthetic(objectType, [], []);
+    basicChecks(f,
+        element: isNull,
+        displayName: '() → Object',
+        returnType: same(objectType));
+  }
+
+  test_synthetic_substitute() {
+    // Map<T, U> Function<U extends T>(T x, U y)
+    var t = new MockTypeParameterElement('T');
+    var u = new MockTypeParameterElement('U', bound: t.type);
+    var x = new MockParameterElement('x', type: t.type);
+    var y = new MockParameterElement('y', type: u.type);
+    FunctionType f =
+        new FunctionTypeImpl.synthetic(mapOf(t.type, u.type), [u], [x, y]);
+    FunctionType substituted = f.substitute2([objectType], [t.type]);
+    var uSubstituted = substituted.typeFormals[0];
+    basicChecks(substituted,
+        element: isNull,
+        displayName: '<U extends Object>(Object, U) → Map<Object, U>',
+        returnType: mapOf(objectType, uSubstituted.type),
+        typeFormals: [uSubstituted],
+        normalParameterNames: ['x', 'y'],
+        normalParameterTypes: [same(objectType), same(uSubstituted.type)],
+        parameters: hasLength(2));
+  }
+
+  test_synthetic_substitute_argument_length_mismatch() {
+    // dynamic Function()
+    var t = new MockTypeParameterElement('T');
+    FunctionType f = new FunctionTypeImpl.synthetic(dynamicType, [], []);
+    expect(() => f.substitute2([], [t.type]),
+        throwsA(new isInstanceOf<ArgumentError>()));
+  }
+
+  test_synthetic_substitute_share_returnType_and_parameters() {
+    // int Function<U extends T>(int x)
+    var t = new MockTypeParameterElement('T');
+    var u = new MockTypeParameterElement('U', bound: t.type);
+    var x = new MockParameterElement('x', type: intType);
+    FunctionType f = new FunctionTypeImpl.synthetic(intType, [u], [x]);
+    FunctionType substituted = f.substitute2([objectType], [t.type]);
+    basicChecks(substituted,
+        element: isNull,
+        displayName: '<U extends Object>(int) → int',
+        returnType: same(f.returnType),
+        typeFormals: hasLength(1),
+        normalParameterNames: ['x'],
+        normalParameterTypes: [same(intType)],
+        parameters: same(f.parameters));
+    expect(substituted.typeFormals[0].name, 'U');
+    expect(substituted.typeFormals[0].bound, same(objectType));
+  }
+
+  test_synthetic_substitute_share_returnType_and_typeFormals() {
+    // int Function<U>(T x, U y)
+    var t = new MockTypeParameterElement('T');
+    var u = new MockTypeParameterElement('U');
+    var x = new MockParameterElement('x', type: t.type);
+    var y = new MockParameterElement('y', type: u.type);
+    FunctionType f = new FunctionTypeImpl.synthetic(intType, [u], [x, y]);
+    FunctionType substituted = f.substitute2([objectType], [t.type]);
+    basicChecks(substituted,
+        element: isNull,
+        displayName: '<U>(Object, U) → int',
+        returnType: same(f.returnType),
+        typeFormals: same(f.typeFormals),
+        normalParameterNames: ['x', 'y'],
+        normalParameterTypes: [same(objectType), same(u.type)],
+        parameters: hasLength(2));
+  }
+
+  test_synthetic_substitute_share_typeFormals_and_parameters() {
+    // T Function<U>(U x)
+    var t = new MockTypeParameterElement('T');
+    var u = new MockTypeParameterElement('U');
+    var x = new MockParameterElement('x', type: u.type);
+    FunctionType f = new FunctionTypeImpl.synthetic(t.type, [u], [x]);
+    FunctionType substituted = f.substitute2([objectType], [t.type]);
+    basicChecks(substituted,
+        element: isNull,
+        displayName: '<U>(U) → Object',
+        returnType: same(objectType),
+        typeFormals: same(f.typeFormals),
+        normalParameterNames: ['x'],
+        normalParameterTypes: [same(u.type)],
+        parameters: same(f.parameters));
+  }
+
+  test_synthetic_substitute_unchanged() {
+    // dynamic Function<U>(U x)
+    var t = new MockTypeParameterElement('T');
+    var u = new MockTypeParameterElement('U');
+    var x = new MockParameterElement('x', type: u.type);
+    FunctionType f = new FunctionTypeImpl.synthetic(dynamicType, [u], [x]);
+    FunctionType substituted = f.substitute2([objectType], [t.type]);
+    expect(substituted, same(f));
+  }
+
+  test_synthetic_typeFormals() {
+    var t = new MockTypeParameterElement('T');
+    FunctionType f = new FunctionTypeImpl.synthetic(t.type, [t], []);
+    basicChecks(f,
+        element: isNull,
+        displayName: '<T>() → T',
+        returnType: same(t.type),
+        typeFormals: [same(t)]);
+  }
+
   test_unnamedConstructor() {
     var e = new MockFunctionTypedElement();
     FunctionType f = new FunctionTypeImpl(e);
     basicChecks(f, element: same(e));
   }
 
+  test_unnamedConstructor_instantiate_argument_length_mismatch() {
+    var t = new MockTypeParameterElement('T');
+    var e = new MockFunctionTypedElement(typeParameters: [t]);
+    FunctionType f = new FunctionTypeImpl(e);
+    expect(() => f.instantiate([]), throwsA(new isInstanceOf<ArgumentError>()));
+  }
+
   test_unnamedConstructor_instantiate_noop() {
     var t = new MockTypeParameterElement('T');
     var p = new MockParameterElement('x', type: t.type);
@@ -454,7 +648,6 @@
         normalParameterTypes: [same(t.type)],
         parameters: [same(p)]);
     expect(instantiated.typeArguments[0], same(t.type));
-    // TODO(paulberry): test instantiate length mismatch
   }
 
   test_unnamedConstructor_instantiate_noTypeParameters() {
@@ -520,6 +713,25 @@
         parameters: [same(p)]);
   }
 
+  test_unnamedConstructor_nonTypedef_noTypeArguments() {
+    var e = new MockFunctionTypedElement();
+    FunctionType f = new FunctionTypeImpl(e);
+    basicChecks(f, element: same(e));
+  }
+
+  test_unnamedConstructor_nonTypedef_withTypeArguments() {
+    var t = new MockTypeParameterElement('T');
+    var c = new MockClassElement('C', typeParameters: [t]);
+    var e = new MockMethodElement(c, returnType: t.type);
+    FunctionType f = new FunctionTypeImpl(e);
+    basicChecks(f,
+        element: same(e),
+        typeArguments: [same(t.type)],
+        typeParameters: [same(t)],
+        displayName: '() → T',
+        returnType: same(t.type));
+  }
+
   test_unnamedConstructor_normalParameter() {
     var p = new MockParameterElement('x');
     var e = new MockFunctionTypedElement(parameters: [p]);
@@ -596,6 +808,18 @@
     basicChecks(f, element: same(e));
   }
 
+  test_unnamedConstructor_substitute_argument_length_mismatch() {
+    // abstract class C<T> {
+    //   dynamic f();
+    // }
+    var t = new MockTypeParameterElement('T');
+    var c = new MockClassElement('C', typeParameters: [t]);
+    var e = new MockFunctionTypedElement(enclosingElement: c);
+    FunctionType f = new FunctionTypeImpl(e);
+    expect(() => f.substitute2([], [t.type]),
+        throwsA(new isInstanceOf<ArgumentError>()));
+  }
+
   test_unnamedConstructor_substitute_bound_recursive() {
     // abstract class C<T> {
     //   Map<S, V> f<S extends T, T extends U, V extends T>();
@@ -644,6 +868,62 @@
     }
   }
 
+  test_unnamedConstructor_substitute_bound_recursive_parameter() {
+    // abstract class C<T> {
+    //   void f<S extends T, T extends U, V extends T>(S x, V y);
+    // }
+    var s = new MockTypeParameterElement('S');
+    var t = new MockTypeParameterElement('T');
+    var u = new MockTypeParameterElement('U');
+    var v = new MockTypeParameterElement('V');
+    s.bound = t.type;
+    t.bound = u.type;
+    v.bound = t.type;
+    var c = new MockClassElement('C', typeParameters: [u]);
+    var x = new MockParameterElement('x', type: s.type);
+    var y = new MockParameterElement('y', type: v.type);
+    var e = new MockFunctionTypedElement(
+        returnType: voidType,
+        typeParameters: [s, t, v],
+        enclosingElement: c,
+        parameters: [x, y]);
+    FunctionType f = new FunctionTypeImpl(e);
+    var substituted = f.substitute2([objectType], [u.type]);
+    basicChecks(substituted,
+        element: same(e),
+        displayName: isNotNull,
+        returnType: same(voidType),
+        normalParameterNames: ['x', 'y'],
+        normalParameterTypes: hasLength(2),
+        parameters: hasLength(2),
+        typeFormals: hasLength(3),
+        typeParameters: [same(u)],
+        typeArguments: [same(objectType)]);
+    if (bug_33300_fixed) {
+      expect(substituted.displayName,
+          '<S extends T,T extends Object,V extends T>(S, V) → void');
+    } else {
+      expect(
+          substituted.displayName,
+          '<S extends T extends Object,T extends Object,V extends T>(S, V) '
+          '→ void');
+    }
+    var s2 = substituted.typeFormals[0];
+    var t2 = substituted.typeFormals[1];
+    var v2 = substituted.typeFormals[2];
+    expect(s2.name, 'S');
+    expect(t2.name, 'T');
+    expect(v2.name, 'V');
+    expect(s2.bound, t2.type);
+    expect(t2.bound, same(objectType));
+    expect(v2.bound, t2.type);
+    if (bug_33301_fixed) {
+      expect(substituted.normalParameterTypes, [same(s2.type), same(v2.type)]);
+    } else {
+      expect(substituted.normalParameterTypes, [same(s.type), same(v.type)]);
+    }
+  }
+
   test_unnamedConstructor_substitute_bound_simple() {
     // abstract class C<T> {
     //   U f<U extends T>();
@@ -775,7 +1055,7 @@
   }
 }
 
-class MockClassElement implements ClassElement {
+class MockClassElement implements ClassElementImpl {
   @override
   final List<TypeParameterElement> typeParameters;
 
@@ -939,7 +1219,10 @@
   ClassElement get enclosingElement => super.enclosingElement;
 }
 
-class MockParameterElement implements ParameterElement {
+class MockParameterElement implements ParameterElementImpl {
+  @override
+  Element enclosingElement;
+
   @override
   final String name;
 
diff --git a/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart b/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart
index fc243e5..66b2d52 100644
--- a/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart
+++ b/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart
@@ -40,27 +40,132 @@
 import '../../generated/parser_test.dart';
 import '../../generated/test_support.dart';
 
+Element _buildElement(kernel.Class coreType) {
+  ClassElementImpl element =
+      new ClassElementImpl(coreType.name, coreType.fileOffset);
+  element.typeParameters = coreType.typeParameters.map((parameter) {
+    TypeParameterElementImpl element =
+        new TypeParameterElementImpl(parameter.name, parameter.fileOffset);
+    element.type = new TypeParameterTypeImpl(element);
+    return element;
+  }).toList();
+  return element;
+}
+
+class CompilerTestContext extends CompilerContext {
+  KernelTarget kernelTarget;
+  TypeProvider _typeProvider;
+
+  CompilerTestContext(ProcessedOptions options) : super(options);
+
+  Uri get entryPoint => options.inputs.single;
+
+  static Future<T> runWithTestOptions<T>(
+      Future<T> action(CompilerTestContext c)) async {
+    // TODO(danrubel): Consider HybridFileSystem.
+    final MemoryFileSystem fs =
+        new MemoryFileSystem(Uri.parse("org-dartlang-test:///"));
+
+    /// The custom URI used to locate the dill file in the MemoryFileSystem.
+    final Uri sdkSummary = fs.currentDirectory.resolve("vm_platform.dill");
+
+    /// The in memory test code URI
+    final Uri entryPoint = fs.currentDirectory.resolve("main.dart");
+
+    // Read the dill file containing kernel platform summaries into memory.
+    List<int> sdkSummaryBytes = await new File.fromUri(
+            computePlatformBinariesLocation().resolve("vm_platform.dill"))
+        .readAsBytes();
+    fs.entityForUri(sdkSummary).writeAsBytesSync(sdkSummaryBytes);
+
+    final CompilerOptions optionBuilder = new CompilerOptions()
+      ..strongMode = false // TODO(danrubel): enable strong mode.
+      ..reportMessages = true
+      ..verbose = false
+      ..fileSystem = fs
+      ..sdkSummary = sdkSummary
+      ..onProblem = (FormattedMessage problem, Severity severity,
+          List<FormattedMessage> context) {
+        // TODO(danrubel): Capture problems and check against expectations.
+//        print(problem.formatted);
+      };
+
+    final ProcessedOptions options =
+        new ProcessedOptions(optionBuilder, [entryPoint]);
+
+    UriTranslatorImpl uriTranslator = await options.getUriTranslator();
+
+    return await new CompilerTestContext(options)
+        .runInContext<T>((CompilerContext _c) async {
+      CompilerTestContext c = _c;
+      DillTarget dillTarget = new DillTarget(
+          new Ticker(isVerbose: false), uriTranslator, options.target);
+
+      c.kernelTarget = new KernelTarget(fs, true, dillTarget, uriTranslator);
+
+      // Load the dill file containing platform code.
+      dillTarget.loader.read(Uri.parse('dart:core'), -1, fileUri: sdkSummary);
+      kernel.Component sdkComponent =
+          kernel.loadComponentFromBytes(sdkSummaryBytes);
+      dillTarget.loader
+          .appendLibraries(sdkComponent, byteCount: sdkSummaryBytes.length);
+      await dillTarget.buildOutlines();
+      await c.kernelTarget.buildOutlines();
+      c.kernelTarget.computeCoreTypes();
+      assert(c.kernelTarget.loader.coreTypes != null);
+
+      // Initialize the typeProvider if types should be resolved.
+      Map<String, Element> map = <String, Element>{};
+      var coreTypes = c.kernelTarget.loader.coreTypes;
+      for (var coreType in [
+        coreTypes.boolClass,
+        coreTypes.doubleClass,
+        coreTypes.functionClass,
+        coreTypes.futureClass,
+        coreTypes.futureOrClass,
+        coreTypes.intClass,
+        coreTypes.iterableClass,
+        coreTypes.iteratorClass,
+        coreTypes.listClass,
+        coreTypes.mapClass,
+        coreTypes.nullClass,
+        coreTypes.numClass,
+        coreTypes.objectClass,
+        coreTypes.stackTraceClass,
+        coreTypes.streamClass,
+        coreTypes.stringClass,
+        coreTypes.symbolClass,
+        coreTypes.typeClass
+      ]) {
+        map[coreType.name] = _buildElement(coreType);
+      }
+      Namespace namespace = new Namespace(map);
+      c._typeProvider =
+          new TypeProviderImpl.forNamespaces(namespace, namespace);
+
+      T result;
+      Completer<T> completer = new Completer<T>();
+      // Since we're using `package:test_reflective_loader`, we can't rely on
+      // normal async behavior, as `defineReflectiveSuite` doesn't return a
+      // future. However, since it's built on top of `package:test`, we can
+      // obtain a future that completes when all the tests are done using
+      // `tearDownAll`. This allows this function to complete no earlier than
+      // when the tests are done. This is important, as we don't want to call
+      // `CompilerContext.clear` before then.
+      tearDownAll(() => completer.complete(result));
+      result = await action(c);
+      return completer.future;
+    });
+  }
+
+  static CompilerTestContext get current => CompilerContext.current;
+}
+
 /// Implementation of [AbstractParserTestCase] specialized for testing building
 /// Analyzer AST using the fasta [Forest] API.
 class FastaBodyBuilderTestCase extends Object
     with ParserTestHelpers
     implements AbstractParserTestCase {
-  // TODO(danrubel): Consider HybridFileSystem.
-  static final MemoryFileSystem fs =
-      new MemoryFileSystem(Uri.parse("org-dartlang-test:///"));
-
-  /// The custom URI used to locate the dill file in the MemoryFileSystem.
-  static final Uri sdkSummary = fs.currentDirectory.resolve("vm_platform.dill");
-
-  /// The in memory test code URI
-  static final Uri entryPoint = fs.currentDirectory.resolve("main.dart");
-
-  static ProcessedOptions options;
-
-  static KernelTarget kernelTarget;
-
-  static TypeProvider _typeProvider;
-
   final bool resolveTypes;
 
   String content;
@@ -69,11 +174,18 @@
   /// finished parsing, or `null` (the default) if EOF is expected.
   int expectedEndOffset;
 
+  @override
+  void set enableGenericMethodComments(_) {
+    // Ignored.
+  }
+
   FastaBodyBuilderTestCase(this.resolveTypes);
 
   analyzer.Parser get parser => new ParserProxy(this);
 
-  TypeProvider get typeProvider => _typeProvider;
+  TypeProvider get typeProvider => CompilerTestContext.current._typeProvider;
+
+  bool get usingFastaParser => true;
 
   @override
   void assertNoErrors() {
@@ -90,6 +202,11 @@
     // TODO(brianwilkerson) Implement this.
   }
 
+  @override
+  ExpectedError expectedError(ErrorCode code, int offset, int length) {
+    return new ExpectedError(code, offset, length);
+  }
+
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 
   @override
@@ -396,156 +513,68 @@
     return statement.variables;
   }
 
-  Future setUp() async {
-    // TODO(danrubel): Tear down once all tests in group have been run.
-    if (options != null) {
-      return;
-    }
-
-    // Read the dill file containing kernel platform summaries into memory.
-    List<int> sdkSummaryBytes = await new File.fromUri(
-            computePlatformBinariesLocation().resolve("vm_platform.dill"))
-        .readAsBytes();
-    fs.entityForUri(sdkSummary).writeAsBytesSync(sdkSummaryBytes);
-
-    final CompilerOptions optionBuilder = new CompilerOptions()
-      ..strongMode = false // TODO(danrubel): enable strong mode.
-      ..reportMessages = true
-      ..verbose = false
-      ..fileSystem = fs
-      ..sdkSummary = sdkSummary
-      ..onProblem = (FormattedMessage problem, Severity severity,
-          List<FormattedMessage> context) {
-        // TODO(danrubel): Capture problems and check against expectations.
-//        print(problem.formatted);
-      };
-
-    options = new ProcessedOptions(optionBuilder, [entryPoint]);
-
-    UriTranslatorImpl uriTranslator = await options.getUriTranslator();
-
-    await CompilerContext.runWithOptions(options, (CompilerContext c) async {
-      DillTarget dillTarget = new DillTarget(
-          new Ticker(isVerbose: false), uriTranslator, options.target);
-
-      kernelTarget = new KernelTarget(fs, true, dillTarget, uriTranslator);
-
-      // Load the dill file containing platform code.
-      dillTarget.loader.read(Uri.parse('dart:core'), -1, fileUri: sdkSummary);
-      kernel.Component sdkComponent =
-          kernel.loadComponentFromBytes(sdkSummaryBytes);
-      dillTarget.loader
-          .appendLibraries(sdkComponent, byteCount: sdkSummaryBytes.length);
-      await dillTarget.buildOutlines();
-      await kernelTarget.buildOutlines();
-      kernelTarget.computeCoreTypes();
-      assert(kernelTarget.loader.coreTypes != null);
-
-      // Initialize the typeProvider if types should be resolved.
-      Map<String, Element> map = <String, Element>{};
-      var coreTypes = kernelTarget.loader.coreTypes;
-      for (var coreType in [
-        coreTypes.boolClass,
-        coreTypes.doubleClass,
-        coreTypes.functionClass,
-        coreTypes.futureClass,
-        coreTypes.futureOrClass,
-        coreTypes.intClass,
-        coreTypes.iterableClass,
-        coreTypes.iteratorClass,
-        coreTypes.listClass,
-        coreTypes.mapClass,
-        coreTypes.nullClass,
-        coreTypes.numClass,
-        coreTypes.objectClass,
-        coreTypes.stackTraceClass,
-        coreTypes.streamClass,
-        coreTypes.stringClass,
-        coreTypes.symbolClass,
-        coreTypes.typeClass
-      ]) {
-        map[coreType.name] = _buildElement(coreType);
-      }
-      Namespace namespace = new Namespace(map);
-      _typeProvider = new TypeProviderImpl.forNamespaces(namespace, namespace);
-    });
-  }
-
-  Element _buildElement(kernel.Class coreType) {
-    ClassElementImpl element =
-        new ClassElementImpl(coreType.name, coreType.fileOffset);
-    element.typeParameters = coreType.typeParameters.map((parameter) {
-      TypeParameterElementImpl element =
-          new TypeParameterElementImpl(parameter.name, parameter.fileOffset);
-      element.type = new TypeParameterTypeImpl(element);
-      return element;
-    }).toList();
-    return element;
-  }
-
   T _parse<T>(
       String source, void parseFunction(Parser parser, Token previousToken),
       {bool inAsync: false, bool inCatchBlock: false}) {
     ScannerResult scan = scanString(source);
 
-    return CompilerContext.runWithOptions(options, (CompilerContext c) {
-      KernelLibraryBuilder library = new KernelLibraryBuilder(
-        entryPoint,
-        entryPoint,
-        kernelTarget.loader,
-        null /* actualOrigin */,
-        null /* enclosingLibrary */,
-      );
-      List<KernelTypeVariableBuilder> typeVariableBuilders =
-          <KernelTypeVariableBuilder>[];
-      List<KernelFormalParameterBuilder> formalParameterBuilders =
-          <KernelFormalParameterBuilder>[];
-      KernelProcedureBuilder procedureBuilder = new KernelProcedureBuilder(
-          null /* metadata */,
-          Modifier.staticMask /* or Modifier.varMask */,
-          kernelTarget.dynamicType,
-          "analyzerTest",
-          typeVariableBuilders,
-          formalParameterBuilders,
-          kernel.ProcedureKind.Method,
-          library,
-          -1 /* charOffset */,
-          -1 /* charOpenParenOffset */,
-          -1 /* charEndOffset */);
-
-      TypeInferrerDisabled typeInferrer =
-          new TypeInferrerDisabled(new TypeSchemaEnvironment(
-        kernelTarget.loader.coreTypes,
-        kernelTarget.loader.hierarchy,
-        // TODO(danrubel): Enable strong mode.
-        false /* strong mode */,
-      ));
-
-      AstBodyBuilder builder = new AstBodyBuilder(
+    CompilerTestContext c = CompilerTestContext.current;
+    KernelLibraryBuilder library = new KernelLibraryBuilder(
+      c.entryPoint,
+      c.entryPoint,
+      c.kernelTarget.loader,
+      null /* actualOrigin */,
+      null /* enclosingLibrary */,
+    );
+    List<KernelTypeVariableBuilder> typeVariableBuilders =
+        <KernelTypeVariableBuilder>[];
+    List<KernelFormalParameterBuilder> formalParameterBuilders =
+        <KernelFormalParameterBuilder>[];
+    KernelProcedureBuilder procedureBuilder = new KernelProcedureBuilder(
+        null /* metadata */,
+        Modifier.staticMask /* or Modifier.varMask */,
+        c.kernelTarget.dynamicType,
+        "analyzerTest",
+        typeVariableBuilders,
+        formalParameterBuilders,
+        kernel.ProcedureKind.Method,
         library,
-        procedureBuilder,
-        new UnlinkedScope(),
-        null,
-        kernelTarget.loader.hierarchy,
-        kernelTarget.loader.coreTypes,
-        null /* classBuilder */,
-        false /* isInstanceMember */,
-        null /* uri */,
-        typeInferrer,
-        typeProvider,
-      )..constantContext = ConstantContext.none; // .inferred ?
+        -1 /* charOffset */,
+        -1 /* charOpenParenOffset */,
+        -1 /* charEndOffset */);
 
-      Parser parser = new Parser(builder);
-      if (inAsync) {
-        parser.asyncState = AsyncModifier.Async;
-      }
-      if (inCatchBlock) {
-        builder.inCatchBlock = inCatchBlock;
-      }
-      parseFunction(parser, parser.syntheticPreviousToken(scan.tokens));
-      // TODO(brianwilkerson) Check `expectedEndOffset` if it is not `null`.
-      return builder.pop();
-    });
+    TypeInferrerDisabled typeInferrer =
+        new TypeInferrerDisabled(new TypeSchemaEnvironment(
+      c.kernelTarget.loader.coreTypes,
+      c.kernelTarget.loader.hierarchy,
+      // TODO(danrubel): Enable strong mode.
+      false /* strong mode */,
+    ));
+
+    AstBodyBuilder builder = new AstBodyBuilder(
+      library,
+      procedureBuilder,
+      new UnlinkedScope(),
+      null,
+      c.kernelTarget.loader.hierarchy,
+      c.kernelTarget.loader.coreTypes,
+      null /* classBuilder */,
+      false /* isInstanceMember */,
+      null /* uri */,
+      typeInferrer,
+      typeProvider,
+    )..constantContext = ConstantContext.none; // .inferred ?
+
+    Parser parser = new Parser(builder);
+    if (inAsync) {
+      parser.asyncState = AsyncModifier.Async;
+    }
+    if (inCatchBlock) {
+      builder.inCatchBlock = inCatchBlock;
+    }
+    parseFunction(parser, parser.syntheticPreviousToken(scan.tokens));
+    // TODO(brianwilkerson) Check `expectedEndOffset` if it is not `null`.
+    return builder.pop();
   }
 }
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart b/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart
index d312b78..492f026 100644
--- a/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart
@@ -29,7 +29,6 @@
 ''');
   }
 
-  @failingTest
   void test_missingComma() {
     testRecovery('''
 f() => [a, b c];
diff --git a/pkg/analyzer/test/src/fasta/recovery/paired_tokens_test.dart b/pkg/analyzer/test/src/fasta/recovery/paired_tokens_test.dart
index fdd1f54..edc6d29 100644
--- a/pkg/analyzer/test/src/fasta/recovery/paired_tokens_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/paired_tokens_test.dart
@@ -238,9 +238,7 @@
 ''');
   }
 
-  @failingTest
   void test_listLiteral_inner_last() {
-    // Parser crashes
     testRecovery('''
 var x = [[0], [1];
 ''', [ScannerErrorCode.EXPECTED_TOKEN], '''
@@ -248,13 +246,19 @@
 ''');
   }
 
-  @failingTest
   void test_listLiteral_inner_notLast() {
-    // Parser crashes
     testRecovery('''
 var x = [[0], [1, [2]];
 ''', [ScannerErrorCode.EXPECTED_TOKEN], '''
-var x = [[0], [1], [2]];
+var x = [[0], [1, [2]]];
+''');
+  }
+
+  void test_listLiteral_missing_comma() {
+    testRecovery('''
+var x = [0 1];
+''', [ParserErrorCode.EXPECTED_TOKEN], '''
+var x = [0, 1];
 ''');
   }
 
diff --git a/pkg/analyzer/test/src/fasta/resolution_test.dart b/pkg/analyzer/test/src/fasta/resolution_test.dart
index 0eedb6b..1fbaa11 100644
--- a/pkg/analyzer/test/src/fasta/resolution_test.dart
+++ b/pkg/analyzer/test/src/fasta/resolution_test.dart
@@ -10,9 +10,11 @@
 import '../../generated/parser_test.dart';
 import 'body_builder_test_helper.dart';
 
-main() async {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(ResolutionTest);
+main() {
+  return CompilerTestContext.runWithTestOptions((_) {
+    defineReflectiveSuite(() {
+      defineReflectiveTests(ResolutionTest);
+    });
   });
 }
 
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 0362a9f..dd8e30b 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -8140,6 +8140,21 @@
 ''');
   }
 
+  test_metadata_enumConstantDeclaration() async {
+    var library = await checkLibrary('const a = null; enum E { @a v }');
+    checkElementText(library, r'''
+enum E {
+  synthetic final int index;
+  synthetic static const List<E> values;
+  @
+        a/*location: test.dart;a?*/
+  static const E v;
+  String toString() {}
+}
+const dynamic a = null;
+''');
+  }
+
   test_metadata_enumDeclaration() async {
     var library = await checkLibrary('const a = null; @a enum E { v }');
     checkElementText(library, r'''
diff --git a/pkg/analyzer/test/src/summary/summary_common.dart b/pkg/analyzer/test/src/summary/summary_common.dart
index 37b5eca..0f78b0f 100644
--- a/pkg/analyzer/test/src/summary/summary_common.dart
+++ b/pkg/analyzer/test/src/summary/summary_common.dart
@@ -8674,6 +8674,12 @@
         .annotations);
   }
 
+  test_metadata_enumConstantDeclaration() {
+    checkAnnotationA(serializeEnumText('const a = null; enum E { @a v }')
+        .values[0]
+        .annotations);
+  }
+
   test_metadata_enumDeclaration() {
     checkAnnotationA(
         serializeEnumText('const a = null; @a enum E { v }').annotations);
diff --git a/pkg/analyzer/tool/summary/generate.dart b/pkg/analyzer/tool/summary/generate.dart
index 0fc27f1..1604d01 100644
--- a/pkg/analyzer/tool/summary/generate.dart
+++ b/pkg/analyzer/tool/summary/generate.dart
@@ -312,7 +312,7 @@
             cls.allFields.add(new idlModel.FieldDeclaration(doc,
                 classMember.name, fieldType, id, isDeprecated, isInformative));
           } else if (classMember is ConstructorDeclaration &&
-              classMember.name.name.endsWith('fromBuffer')) {
+              classMember.name.endsWith('fromBuffer')) {
             // Ignore `fromBuffer` declarations; they simply forward to the
             // read functions generated by [_generateReadFunction].
           } else {
diff --git a/pkg/analyzer/tool/summary/mini_ast.dart b/pkg/analyzer/tool/summary/mini_ast.dart
index 6dc47f7..d715e53 100644
--- a/pkg/analyzer/tool/summary/mini_ast.dart
+++ b/pkg/analyzer/tool/summary/mini_ast.dart
@@ -85,22 +85,13 @@
 
 /// "Mini AST" representation of a constructor declaration.
 class ConstructorDeclaration extends ClassMember {
-  final ConstructorReference name;
+  final String name;
 
   ConstructorDeclaration(
       Comment documentationComment, List<Annotation> metadata, this.name)
       : super(documentationComment, metadata);
 }
 
-/// "Mini AST" representation of a constructor reference.
-class ConstructorReference {
-  final String name;
-
-  final String constructorName;
-
-  ConstructorReference(this.name, this.constructorName);
-}
-
 /// "Mini AST" representation of an individual enum constant in an enum
 /// declaration.
 class EnumConstantDeclaration extends AnnotatedNode {
@@ -218,16 +209,6 @@
     }
   }
 
-  @override
-  void endConstructorReference(
-      Token start, Token periodBeforeName, Token endToken) {
-    debugEvent("ConstructorReference");
-    String constructorName = popIfNotNull(periodBeforeName);
-    pop(); // Type arguments
-    String name = pop();
-    push(new ConstructorReference(name, constructorName));
-  }
-
   void endEnum(Token enumKeyword, Token leftBrace, int count) {
     debugEvent("Enum");
     List<EnumConstantDeclaration> constants =
@@ -245,7 +226,8 @@
       Token beginToken, Token factoryKeyword, Token endToken) {
     debugEvent("FactoryMethod");
     pop(); // Body
-    ConstructorReference name = pop();
+    pop(); // Type variables
+    String name = pop();
     List<Annotation> metadata = pop();
     Comment comment = pop();
     push(new ConstructorDeclaration(comment, metadata, name));
@@ -338,11 +320,12 @@
   void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) {
     debugEvent("Metadata");
     inMetadata = false;
-    List<Expression> arguments = pop();
+    List arguments = pop();
     String constructorName = popIfNotNull(periodBeforeName);
     pop(); // Type arguments
     String name = pop();
-    push(new Annotation(name, constructorName, arguments));
+    push(new Annotation(name, constructorName,
+        arguments == null ? null : arguments.cast<Expression>()));
   }
 
   @override
diff --git a/pkg/analyzer_cli/lib/src/analyzer_impl.dart b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
index b3b94a9..1974fc4 100644
--- a/pkg/analyzer_cli/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
@@ -5,15 +5,14 @@
 library analyzer_cli.src.analyzer_impl;
 
 import 'dart:async';
-import 'dart:collection';
 import 'dart:io';
 
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/generated/engine.dart' hide AnalysisResult;
-import 'package:analyzer/src/generated/java_io.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/utilities_general.dart';
@@ -36,24 +35,20 @@
   final int startTime;
 
   final AnalysisOptions analysisOptions;
-  final AnalysisContext context;
   final AnalysisDriver analysisDriver;
 
   /// Accumulated analysis statistics.
   final AnalysisStats stats;
 
-  final Source librarySource;
+  /// The library file to analyze.
+  final FileState libraryFile;
 
-  /// All [Source]s references by the analyzed library.
-  final Set<Source> sources = new Set<Source>();
+  /// All files references by the analyzed library.
+  final Set<String> files = new Set<String>();
 
   /// All [AnalysisErrorInfo]s in the analyzed library.
   final List<AnalysisErrorInfo> errorInfos = new List<AnalysisErrorInfo>();
 
-  /// [HashMap] between sources and analysis error infos.
-  final HashMap<Source, AnalysisErrorInfo> sourceErrorsMap =
-      new HashMap<Source, AnalysisErrorInfo>();
-
   /// If the file specified on the command line is part of a package, the name
   /// of that package.  Otherwise `null`.  This allows us to analyze the file
   /// specified on the command line as though it is reached via a "package:"
@@ -61,8 +56,8 @@
   /// specified the "--package-warnings" option.
   String _selfPackageName;
 
-  AnalyzerImpl(this.analysisOptions, this.context, this.analysisDriver,
-      this.librarySource, this.options, this.stats, this.startTime);
+  AnalyzerImpl(this.analysisOptions, this.analysisDriver, this.libraryFile,
+      this.options, this.stats, this.startTime);
 
   void addCompilationUnitSource(
       CompilationUnitElement unit, Set<CompilationUnitElement> units) {
@@ -71,7 +66,7 @@
     }
     Source source = unit.source;
     if (source != null) {
-      sources.add(source);
+      files.add(source.fullName);
     }
   }
 
@@ -105,6 +100,8 @@
   /// it will be marked as being for a cold VM.
   Future<ErrorSeverity> analyze(ErrorFormatter formatter,
       {int printMode: 1}) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     setupForAnalysis();
     return await _analyze(printMode, formatter);
   }
@@ -123,27 +120,23 @@
     return status;
   }
 
-  /// Fills [errorInfos] using [sources].
+  /// Fills [errorInfos] using [files].
   Future<Null> prepareErrors() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     PerformanceTag previous = _prepareErrorsTag.makeCurrent();
     try {
-      for (Source source in sources) {
-        if (analysisDriver != null) {
-          String path = source.fullName;
-          ErrorsResult errorsResult = await analysisDriver.getErrors(path);
-          errorInfos.add(new AnalysisErrorInfoImpl(
-              errorsResult.errors, errorsResult.lineInfo));
-        } else {
-          context.computeErrors(source);
-          errorInfos.add(context.getErrors(source));
-        }
+      for (String path in files) {
+        ErrorsResult errorsResult = await analysisDriver.getErrors(path);
+        errorInfos.add(new AnalysisErrorInfoImpl(
+            errorsResult.errors, errorsResult.lineInfo));
       }
     } finally {
       previous.makeCurrent();
     }
   }
 
-  /// Fills [sources].
+  /// Fills [files].
   void prepareSources(LibraryElement library) {
     var units = new Set<CompilationUnitElement>();
     var libraries = new Set<LibraryElement>();
@@ -152,9 +145,9 @@
 
   /// Setup local fields such as the analysis context for analysis.
   void setupForAnalysis() {
-    sources.clear();
+    files.clear();
     errorInfos.clear();
-    Uri libraryUri = librarySource.uri;
+    Uri libraryUri = libraryFile.uri;
     if (libraryUri.scheme == 'package' && libraryUri.pathSegments.length > 0) {
       _selfPackageName = libraryUri.pathSegments[0];
     }
@@ -162,14 +155,13 @@
 
   Future<ErrorSeverity> _analyze(
       int printMode, ErrorFormatter formatter) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // Don't try to analyze parts.
-    String path = librarySource.fullName;
-    SourceKind librarySourceKind = analysisDriver != null
-        ? await analysisDriver.getSourceKind(path)
-        : context.computeKindOf(librarySource);
-    if (librarySourceKind == SourceKind.PART) {
+    if (libraryFile.isPart) {
+      String libraryPath = libraryFile.path;
       stderr.writeln("Only libraries can be analyzed.");
-      stderr.writeln("$path is a part and can not be analyzed.");
+      stderr.writeln("$libraryPath is a part and can not be analyzed.");
       return ErrorSeverity.ERROR;
     }
 
@@ -207,7 +199,6 @@
     }
   }
 
-  // TODO(devoncarew): This is never called.
   /// Determine whether the given URI refers to a package being analyzed.
   bool _isAnalyzedPackage(Uri uri) {
     if (uri.scheme != 'package' || uri.pathSegments.isEmpty) {
@@ -225,6 +216,7 @@
     }
   }
 
+  // TODO(devoncarew): This is never called.
   void _printColdPerf() {
     // Print cold VM performance numbers.
     int totalTime = currentTimeMillis - startTime;
@@ -241,39 +233,20 @@
   }
 
   Future<LibraryElement> _resolveLibrary() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     PerformanceTag previous = _resolveLibraryTag.makeCurrent();
     try {
-      if (analysisDriver != null) {
-        String path = librarySource.fullName;
-        analysisDriver.priorityFiles = [path];
-        UnitElementResult elementResult =
-            await analysisDriver.getUnitElement(path);
-        return elementResult.element.library;
-      } else {
-        return context.computeLibraryElement(librarySource);
-      }
+      String libraryPath = libraryFile.path;
+      analysisDriver.priorityFiles = [libraryPath];
+      UnitElementResult elementResult =
+          await analysisDriver.getUnitElement(libraryPath);
+      return elementResult.element.library;
     } finally {
       previous.makeCurrent();
     }
   }
 
-  /// Return the corresponding package directory or `null` if none is found.
-  static JavaFile getPackageDirectoryFor(JavaFile sourceFile) {
-    // We are going to ask parent file, so get absolute path.
-    sourceFile = sourceFile.getAbsoluteFile();
-    // Look in the containing directories.
-    JavaFile dir = sourceFile.getParentFile();
-    while (dir != null) {
-      JavaFile packagesDir = new JavaFile.relative(dir, "packages");
-      if (packagesDir.exists()) {
-        return packagesDir;
-      }
-      dir = dir.getParentFile();
-    }
-    // Not found.
-    return null;
-  }
-
   /// Return `true` if the given [pathName] is in the Pub cache.
   static bool _isPathInPubCache(String pathName) {
     List<String> parts = path.split(pathName);
diff --git a/pkg/analyzer_cli/lib/src/batch_mode.dart b/pkg/analyzer_cli/lib/src/batch_mode.dart
index 0bd9d6f..5bd75b0 100644
--- a/pkg/analyzer_cli/lib/src/batch_mode.dart
+++ b/pkg/analyzer_cli/lib/src/batch_mode.dart
@@ -32,6 +32,8 @@
     Stream<String> cmdLine =
         stdin.transform(utf8.decoder).transform(new LineSplitter());
     cmdLine.listen((String line) async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       // Maybe finish.
       if (line.isEmpty) {
         var time = stopwatch.elapsedMilliseconds;
diff --git a/pkg/analyzer_cli/lib/src/build_mode.dart b/pkg/analyzer_cli/lib/src/build_mode.dart
index 87f6f10..d83ab5e 100644
--- a/pkg/analyzer_cli/lib/src/build_mode.dart
+++ b/pkg/analyzer_cli/lib/src/build_mode.dart
@@ -70,6 +70,8 @@
    */
   Future<Null> analyze(
       CommandLineOptions options, Map<String, WorkerInput> inputs) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     var packageBundleProvider =
         new WorkerPackageBundleProvider(packageBundleCache, inputs);
     var buildMode = new BuildMode(
@@ -88,7 +90,11 @@
    */
   @override
   Future<WorkResponse> performRequest(WorkRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return logger.runAsync('Perform request', () async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       errorBuffer.clear();
       outBuffer.clear();
       try {
@@ -133,6 +139,8 @@
    */
   @override
   Future<Null> run() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     errorSink = errorBuffer;
     outSink = outBuffer;
     exitHandler = (int exitCode) {
@@ -191,7 +199,11 @@
    * Perform package analysis according to the given [options].
    */
   Future<ErrorSeverity> analyze() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return await logger.runAsync('Analyze', () async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       // Write initial progress message.
       if (!options.machineFormat) {
         outSink.writeln("Analyzing ${options.sourceFiles.join(', ')}...");
@@ -240,8 +252,12 @@
       assembler = new PackageBundleAssembler();
       if (_shouldOutputSummary) {
         await logger.runAsync('Build and write output summary', () async {
+          // TODO(brianwilkerson) Determine whether this await is necessary.
+          await null;
           // Prepare all unlinked units.
           await logger.runAsync('Prepare unlinked units', () async {
+            // TODO(brianwilkerson) Determine whether this await is necessary.
+            await null;
             for (var src in explicitSources) {
               await _prepareUnlinkedUnit('${src.uri}');
             }
@@ -316,6 +332,8 @@
   }
 
   Future<ErrorSeverity> _computeMaxSeverity() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     ErrorSeverity maxSeverity = ErrorSeverity.NONE;
     if (!options.buildSuppressExitCode) {
       for (Source source in explicitSources) {
@@ -451,6 +469,8 @@
    * Otherwise compute it and store into the [uriToUnit] and [assembler].
    */
   Future<Null> _prepareUnlinkedUnit(String absoluteUri) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // Maybe an input package contains the source.
     if (summaryDataStore.unlinkedMap[absoluteUri] != null) {
       return;
@@ -474,7 +494,11 @@
    * is sent to a new file at that path.
    */
   Future<Null> _printErrors({String outputPath}) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     await logger.runAsync('Compute and print analysis errors', () async {
+      // TODO(brianwilkerson) Determine whether this await is necessary.
+      await null;
       StringBuffer buffer = new StringBuffer();
       var severityProcessor = (AnalysisError error) =>
           determineProcessedSeverity(error, options, analysisOptions);
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 492de93..74425a8 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -10,18 +10,15 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/src/context/builder.dart';
-import 'package:analyzer/src/context/context.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/file_system/file_system.dart';
-import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/interner.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/utilities_general.dart'
     show PerformanceTag;
 import 'package:analyzer/src/plugin/resolver_provider.dart';
@@ -31,7 +28,6 @@
 import 'package:analyzer/src/source/path_filter.dart';
 import 'package:analyzer/src/source/pub_package_map_provider.dart';
 import 'package:analyzer/src/source/sdk_ext.dart';
-import 'package:analyzer/src/source/source_resource.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/summary/summary_sdk.dart' show SummaryBasedDartSdk;
@@ -107,17 +103,16 @@
   /// The plugins that are defined outside the `analyzer_cli` package.
   List<Plugin> _userDefinedPlugins = <Plugin>[];
 
-  /// The context that was most recently created by a call to [_analyzeAll], or
+  /// The driver that was most recently created by a call to [_analyzeAll], or
   /// `null` if [_analyzeAll] hasn't been called yet.
-  InternalAnalysisContext _context;
-
+  @visibleForTesting
   AnalysisDriver analysisDriver;
 
   /// The total number of source files loaded by an AnalysisContext.
   int _analyzedFileCount = 0;
 
-  /// If [_context] is not `null`, the [CommandLineOptions] that guided its
-  /// creation.
+  /// If [analysisDriver] is not `null`, the [CommandLineOptions] that guided
+  /// its creation.
   CommandLineOptions _previousOptions;
 
   @override
@@ -149,10 +144,6 @@
     }
   }
 
-  /// This Driver's current analysis context.
-  @visibleForTesting
-  AnalysisContext get context => _context;
-
   /// The crash reporting instance for analyzer-cli.
   /// TODO(devoncarew): Replace with the real crash product ID.
   CrashReportSender get crashReportSender => (_crashReportSender ??=
@@ -163,9 +154,21 @@
     _userDefinedPlugins = plugins ?? <Plugin>[];
   }
 
+  /**
+   * Converts the given [filePath] into absolute and normalized.
+   */
+  String normalizePath(String filePath) {
+    filePath = filePath.trim();
+    filePath = resourceProvider.pathContext.absolute(filePath);
+    filePath = resourceProvider.pathContext.normalize(filePath);
+    return filePath;
+  }
+
   @override
   Future<Null> start(List<String> args) async {
-    if (_context != null) {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
+    if (analysisDriver != null) {
       throw new StateError("start() can only be called once");
     }
     int startTime = new DateTime.now().millisecondsSinceEpoch;
@@ -196,6 +199,8 @@
     } else if (options.batchMode) {
       BatchRunner batchRunner = new BatchRunner(outSink, errorSink);
       batchRunner.runAsBatch(args, (List<String> args) async {
+        // TODO(brianwilkerson) Determine whether this await is necessary.
+        await null;
         CommandLineOptions options = CommandLineOptions.parse(args);
         return await _analyzeAll(options);
       });
@@ -207,8 +212,8 @@
       }
     }
 
-    if (_context != null) {
-      _analyzedFileCount += _context.sources.length;
+    if (analysisDriver != null) {
+      _analyzedFileCount += analysisDriver.knownFiles.length;
     }
 
     // Send how long analysis took.
@@ -229,6 +234,8 @@
   }
 
   Future<ErrorSeverity> _analyzeAll(CommandLineOptions options) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     PerformanceTag previous = _analyzeAllTag.makeCurrent();
     try {
       return await _analyzeAllImpl(options);
@@ -244,6 +251,8 @@
 
   /// Perform analysis according to the given [options].
   Future<ErrorSeverity> _analyzeAllImpl(CommandLineOptions options) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (!options.machineFormat) {
       List<String> fileNames = options.sourceFiles.map((String file) {
         file = path.normalize(file);
@@ -259,14 +268,14 @@
     }
 
     // These are used to do part file analysis across sources.
-    Set<Uri> libUris = new Set<Uri>();
-    Set<Source> danglingParts = new Set<Source>();
+    Set<FileState> libraryFiles = new Set<FileState>();
+    Set<FileState> danglingParts = new Set<FileState>();
 
-    // Note: This references _context via closure, so it will change over time
-    // during the following analysis.
+    // Note: This references analysisDriver via closure, so it will change over
+    // time during the following analysis.
     SeverityProcessor defaultSeverityProcessor = (AnalysisError error) {
       return determineProcessedSeverity(
-          error, options, _context.analysisOptions);
+          error, options, analysisDriver.analysisOptions);
     };
 
     // We currently print out to stderr to ensure that when in batch mode we
@@ -286,16 +295,15 @@
 
     ErrorSeverity allResult = ErrorSeverity.NONE;
 
-    void reportPartError(Source partSource) {
-      errorSink
-          .writeln("${partSource.fullName} is a part and cannot be analyzed.");
+    void reportPartError(String partPath) {
+      errorSink.writeln("$partPath is a part and cannot be analyzed.");
       errorSink.writeln("Please pass in a library that contains this part.");
       io.exitCode = ErrorSeverity.ERROR.ordinal;
       allResult = allResult.max(ErrorSeverity.ERROR);
     }
 
     for (String sourcePath in options.sourceFiles) {
-      sourcePath = sourcePath.trim();
+      sourcePath = normalizePath(sourcePath);
 
       // Create a context, or re-use the previous one.
       try {
@@ -308,16 +316,14 @@
       // Add all the files to be analyzed en masse to the context. Skip any
       // files that were added earlier (whether explicitly or implicitly) to
       // avoid causing those files to be unnecessarily re-read.
-      Set<Source> knownSources = context.sources.toSet();
-      Set<Source> sourcesToAnalyze = new Set<Source>();
-      ChangeSet changeSet = new ChangeSet();
+      Set<String> filesToAnalyze = new Set<String>();
 
       // Collect files for analysis.
       // Note that these files will all be analyzed in the same context.
       // This should be updated when the ContextManager re-work is complete
       // (See: https://github.com/dart-lang/sdk/issues/24133)
       Iterable<io.File> files =
-          _collectFiles(sourcePath, context.analysisOptions);
+          _collectFiles(sourcePath, analysisDriver.analysisOptions);
       if (files.isEmpty) {
         errorSink.writeln('No dart files found at: $sourcePath');
         io.exitCode = ErrorSeverity.ERROR.ordinal;
@@ -325,25 +331,15 @@
       }
 
       for (io.File file in files) {
-        Source source = _computeLibrarySource(file.absolute.path);
-        if (!knownSources.contains(source)) {
-          changeSet.addedSource(source);
-        }
-        sourcesToAnalyze.add(source);
-      }
-
-      if (analysisDriver == null) {
-        context.applyChanges(changeSet);
+        filesToAnalyze.add(file.absolute.path);
       }
 
       // Analyze the libraries.
-      Set<Source> partSources = new Set<Source>();
-
-      for (Source source in sourcesToAnalyze) {
-        if (analysisDriver != null &&
-            (source.shortName == AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE ||
-                source.shortName == AnalysisEngine.ANALYSIS_OPTIONS_FILE)) {
-          file_system.File file = resourceProvider.getFile(source.fullName);
+      for (String path in filesToAnalyze) {
+        var shortName = resourceProvider.pathContext.basename(path);
+        if (shortName == AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE ||
+            shortName == AnalysisEngine.ANALYSIS_OPTIONS_FILE) {
+          file_system.File file = resourceProvider.getFile(path);
           String content = file.readAsStringSync();
           LineInfo lineInfo = new LineInfo.fromContent(content);
           List<AnalysisError> errors =
@@ -352,11 +348,11 @@
           formatter.formatErrors([new AnalysisErrorInfoImpl(errors, lineInfo)]);
           for (AnalysisError error in errors) {
             allResult = allResult.max(determineProcessedSeverity(
-                error, options, _context.analysisOptions));
+                error, options, analysisDriver.analysisOptions));
           }
-        } else if (source.shortName == AnalysisEngine.PUBSPEC_YAML_FILE) {
+        } else if (shortName == AnalysisEngine.PUBSPEC_YAML_FILE) {
           try {
-            file_system.File file = resourceProvider.getFile(source.fullName);
+            file_system.File file = resourceProvider.getFile(path);
             String content = file.readAsStringSync();
             YamlNode node = loadYamlNode(content);
             if (node is YamlMap) {
@@ -368,65 +364,37 @@
                   .formatErrors([new AnalysisErrorInfoImpl(errors, lineInfo)]);
               for (AnalysisError error in errors) {
                 allResult = allResult.max(determineProcessedSeverity(
-                    error, options, _context.analysisOptions));
+                    error, options, analysisDriver.analysisOptions));
               }
             }
           } catch (exception) {
             // If the file cannot be analyzed, ignore it.
           }
         } else {
-          SourceKind sourceKind = analysisDriver != null
-              ? await analysisDriver.getSourceKind(source.fullName)
-              : context.computeKindOf(source);
-          if (sourceKind == SourceKind.PART) {
-            partSources.add(source);
+          var file = analysisDriver.fsState.getFileForPath(path);
+
+          if (file.isPart) {
+            if (!libraryFiles.contains(file.library)) {
+              danglingParts.add(file);
+            }
             continue;
           }
-          ErrorSeverity status = await _runAnalyzer(source, options, formatter);
-          allResult = allResult.max(status);
-          libUris.add(source.uri);
-          if (analysisDriver != null) {
-            // With [AnalysisDriver], we can easily mark previously dangling
-            // parts as no longer dangling once we process the lib.
-            var libFile =
-                analysisDriver.fsState.getFileForPath(source.fullName);
-            for (FileState part in libFile.partedFiles) {
-              danglingParts.remove(part.source);
-            }
-          }
-        }
-      }
+          libraryFiles.add(file);
 
-      // Check that each part has a corresponding source in the input list.
-      for (Source partSource in partSources) {
-        if (analysisDriver != null) {
-          var partFile =
-              analysisDriver.fsState.getFileForPath(partSource.fullName);
-          if (!libUris.contains(partFile.library?.uri)) {
-            // With [AnalysisDriver], we can mark this as dangling, for now, and
-            // later on remove it from this list if its containing lib is found.
-            danglingParts.add(partSource);
-          }
-        } else {
-          final potentialLibs = context.getLibrariesContaining(partSource);
-          bool found = false;
-          for (var lib in potentialLibs) {
-            if (libUris.contains(lib.uri)) {
-              found = true;
-            }
-          }
-          if (!found) {
-            // Without an analysis driver, we can't easily mark it dangling "for
-            // now", but this path is deprecated anyway. Just give up now.
-            reportPartError(partSource);
+          ErrorSeverity status = await _runAnalyzer(file, options, formatter);
+          allResult = allResult.max(status);
+
+          // Mark previously dangling parts as no longer dangling.
+          for (FileState part in file.partedFiles) {
+            danglingParts.remove(part);
           }
         }
       }
     }
 
     // Any dangling parts still in this list were definitely dangling.
-    for (Source partSource in danglingParts) {
-      reportPartError(partSource);
+    for (FileState partFile in danglingParts) {
+      reportPartError(partFile.path);
     }
 
     formatter.flush();
@@ -440,6 +408,8 @@
 
   /// Perform analysis in build mode according to the given [options].
   Future<ErrorSeverity> _buildModeAnalyze(CommandLineOptions options) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     PerformanceTag previous = _analyzeAllTag.makeCurrent();
     try {
       if (options.buildModePersistentWorker) {
@@ -457,33 +427,6 @@
     }
   }
 
-  /// Decide on the appropriate policy for which files need to be fully parsed
-  /// and which files need to be diet parsed, based on [options], and return an
-  /// [AnalyzeFunctionBodiesPredicate] that implements this policy.
-  AnalyzeFunctionBodiesPredicate _chooseDietParsingPolicy(
-      CommandLineOptions options) {
-    if (options.batchMode) {
-      // As analyzer is currently implemented, once a file has been diet
-      // parsed, it can't easily be un-diet parsed without creating a brand new
-      // context and losing caching.  In batch mode, we can't predict which
-      // files we'll need to generate errors and warnings for in the future, so
-      // we can't safely diet parse anything.
-      return (Source source) => true;
-    }
-
-    return (Source source) {
-      if (options.sourceFiles.contains(source.fullName)) {
-        return true;
-      } else if (source.uri.scheme == 'dart') {
-        return options.showSdkWarnings;
-      } else {
-        // TODO(paulberry): diet parse 'package:' imports when we don't want
-        // diagnostics. (Full parse is still needed for "self" packages.)
-        return true;
-      }
-    };
-  }
-
   /// Decide on the appropriate method for resolving URIs based on the given
   /// [options] and [customUrlMappings] settings, and return a
   /// [SourceFactory] that has been configured accordingly.
@@ -609,39 +552,18 @@
     return files;
   }
 
-  /// Convert the given [sourcePath] (which may be relative to the current
-  /// working directory) to a [Source] object that can be fed to the analysis
-  /// context.
-  Source _computeLibrarySource(String sourcePath) {
-    sourcePath = _normalizeSourcePath(sourcePath);
-    File sourceFile = resourceProvider.getFile(sourcePath);
-    Source source = sdk.fromFileUri(sourceFile.toUri());
-    if (source != null) {
-      return source;
-    }
-    source = new FileSource(sourceFile, sourceFile.toUri());
-    Uri uri = _context.sourceFactory.restoreUri(source);
-    if (uri == null) {
-      return source;
-    }
-    return new FileSource(sourceFile, uri);
-  }
-
-  /// Create an analysis context that is prepared to analyze sources according
-  /// to the given [options], and store it in [_context].
+  /// Create an analysis driver that is prepared to analyze sources according
+  /// to the given [options], and store it in [analysisDriver].
   void _createContextAndAnalyze(CommandLineOptions options, String source) {
     // If not the same command-line options, clear cached information.
     if (!_equalCommandLineOptions(_previousOptions, options)) {
       _previousOptions = options;
       contextCache = new ContextCache(resourceProvider, options, verbosePrint);
-      _context = null;
       analysisDriver = null;
     }
 
     AnalysisOptionsImpl analysisOptions =
         createAnalysisOptionsForCommandLineOptions(options, source);
-    analysisOptions.analyzeFunctionBodiesPredicate =
-        _chooseDietParsingPolicy(options);
 
     // Store the [PathFilter] for this context to properly exclude files
     pathFilter = new PathFilter(getContextInfo(options, source).analysisRoot,
@@ -649,8 +571,9 @@
 
     // If we have the analysis driver, and the new analysis options are the
     // same, we can reuse this analysis driver.
-    if (_context != null &&
-        _equalAnalysisOptions(_context.analysisOptions, analysisOptions)) {
+    if (analysisDriver != null &&
+        _equalAnalysisOptions(
+            analysisDriver.analysisOptions, analysisOptions)) {
       return;
     }
 
@@ -660,8 +583,8 @@
     }
 
     // Save stats from previous context before clobbering it.
-    if (_context != null) {
-      _analyzedFileCount += _context.sources.length;
+    if (analysisDriver != null) {
+      _analyzedFileCount += analysisDriver.knownFiles.length;
     }
 
     // Find package info.
@@ -699,44 +622,30 @@
     SourceFactory sourceFactory = _chooseUriResolutionPolicy(options,
         embedderMap, packageInfo, summaryDataStore, true, analysisOptions);
 
-    // Create a context.
-    _context = AnalysisEngine.instance.createAnalysisContext();
-    _context.analysisOptions = analysisOptions;
-    _context.sourceFactory = sourceFactory;
-    (context as AnalysisContextImpl).declaredVariables =
-        new DeclaredVariables.fromMap(options.definedVariables);
+    PerformanceLog log = new PerformanceLog(null);
+    AnalysisDriverScheduler scheduler = new AnalysisDriverScheduler(log);
 
-    if (options.enableNewAnalysisDriver) {
-      PerformanceLog log = new PerformanceLog(null);
-      AnalysisDriverScheduler scheduler = new AnalysisDriverScheduler(log);
-
-      bool enableKernelDriver = options.useCFE;
-      file_system.Folder kernelPlatformBinariesFolder;
-      if (enableKernelDriver && options.dartSdkPlatformBinariesPath != null) {
-        kernelPlatformBinariesFolder =
-            resourceProvider.getFolder(options.dartSdkPlatformBinariesPath);
-      }
-
-      analysisDriver = new AnalysisDriver(
-          scheduler,
-          log,
-          resourceProvider,
-          analysisDriverMemoryByteStore,
-          new FileContentOverlay(),
-          null,
-          context.sourceFactory,
-          context.analysisOptions,
-          enableKernelDriver: enableKernelDriver,
-          kernelPlatformFolder: kernelPlatformBinariesFolder);
-      analysisDriver.results.listen((_) {});
-      analysisDriver.exceptions.listen((_) {});
-      scheduler.start();
-    } else {
-      if (sdkBundle != null) {
-        _context.resultProvider =
-            new InputPackagesResultProvider(_context, summaryDataStore);
-      }
+    bool enableKernelDriver = options.useCFE;
+    file_system.Folder kernelPlatformBinariesFolder;
+    if (enableKernelDriver && options.dartSdkPlatformBinariesPath != null) {
+      kernelPlatformBinariesFolder =
+          resourceProvider.getFolder(options.dartSdkPlatformBinariesPath);
     }
+
+    analysisDriver = new AnalysisDriver(
+        scheduler,
+        log,
+        resourceProvider,
+        analysisDriverMemoryByteStore,
+        new FileContentOverlay(),
+        null,
+        sourceFactory,
+        analysisOptions,
+        enableKernelDriver: enableKernelDriver,
+        kernelPlatformFolder: kernelPlatformBinariesFolder);
+    analysisDriver.results.listen((_) {});
+    analysisDriver.exceptions.listen((_) {});
+    scheduler.start();
   }
 
   /// Return discovered packagespec, or `null` if none is found.
@@ -847,10 +756,10 @@
 
   /// Analyze a single source.
   Future<ErrorSeverity> _runAnalyzer(
-      Source source, CommandLineOptions options, ErrorFormatter formatter) {
+      FileState file, CommandLineOptions options, ErrorFormatter formatter) {
     int startTime = currentTimeMillis;
-    AnalyzerImpl analyzer = new AnalyzerImpl(_context.analysisOptions, _context,
-        analysisDriver, source, options, stats, startTime);
+    AnalyzerImpl analyzer = new AnalyzerImpl(analysisDriver.analysisOptions,
+        analysisDriver, file, options, stats, startTime);
     return analyzer.analyze(formatter);
   }
 
@@ -968,10 +877,6 @@
     }
     return true;
   }
-
-  /// Convert [sourcePath] into an absolute path.
-  static String _normalizeSourcePath(String sourcePath) =>
-      path.normalize(new io.File(sourcePath).absolute.path);
 }
 
 class _DriverError implements Exception {
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index 071b3a4..d82228d 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -33,8 +33,6 @@
 
 /// Analyzer commandline configuration options.
 class CommandLineOptions {
-  final bool enableNewAnalysisDriver = true;
-
   /// Whether declaration casts are enabled (in strong mode)
   final bool declarationCasts;
 
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index 9fb32f4..d33adca 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -11,7 +11,6 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/services/lint.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/util/sdk.dart';
 import 'package:analyzer_cli/src/ansi.dart' as ansi;
@@ -54,6 +53,8 @@
 
   Driver driver;
 
+  AnalysisOptions get analysisOptions => driver.analysisDriver.analysisOptions;
+
   bool get useCFE => false;
 
   bool get usePreviewDart2 => false;
@@ -731,10 +732,10 @@
     await _runLinter_defaultLints();
 
     /// Lints should be enabled.
-    expect(driver.context.analysisOptions.lint, isTrue);
+    expect(analysisOptions.lint, isTrue);
 
     /// Default list should include camel_case_types.
-    var lintNames = getLints(driver.context).map((r) => r.name);
+    var lintNames = analysisOptions.lintRules.map((r) => r.name);
     expect(lintNames, contains('camel_case_types'));
   }
 
@@ -748,16 +749,16 @@
     await _runLinter_lintsInOptions();
 
     /// Lints should be enabled.
-    expect(driver.context.analysisOptions.lint, isTrue);
+    expect(analysisOptions.lint, isTrue);
 
     /// The analysis options file only specifies 'camel_case_types'.
-    var lintNames = getLints(driver.context).map((r) => r.name);
+    var lintNames = analysisOptions.lintRules.map((r) => r.name);
     expect(lintNames, orderedEquals(['camel_case_types']));
   }
 
   test_noLints_lintsDisabled() async {
     await _runLinter_noLintsFlag();
-    expect(driver.context.analysisOptions.lint, isFalse);
+    expect(analysisOptions.lint, isFalse);
   }
 
   test_noLints_noGeneratedWarnings() async {
@@ -767,7 +768,7 @@
 
   test_noLints_noRegisteredLints() async {
     await _runLinter_noLintsFlag();
-    expect(getLints(driver.context), isEmpty);
+    expect(analysisOptions.lintRules, isEmpty);
   }
 
   YamlMap _parseOptions(String src) =>
@@ -843,8 +844,7 @@
 class OptionsTest extends BaseTest {
   String get optionsFileName => AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE;
 
-  List<ErrorProcessor> get processors =>
-      driver.context.analysisOptions.errorProcessors;
+  List<ErrorProcessor> get processors => analysisOptions.errorProcessors;
 
   ErrorProcessor processorFor(AnalysisError error) =>
       processors.firstWhere((p) => p.appliesTo(error));
@@ -910,14 +910,15 @@
 
   test_basic_language() async {
     await _driveBasic();
-    expect(driver.context.analysisOptions.enableSuperMixins, isTrue);
+    expect(analysisOptions.enableSuperMixins, isTrue);
   }
 
   test_basic_strongMode() async {
     await _driveBasic();
-    expect(driver.context.analysisOptions.strongMode, isTrue);
+    expect(analysisOptions.strongMode, isTrue);
     // https://github.com/dart-lang/sdk/issues/26129
-    AnalysisContext sdkContext = driver.context.sourceFactory.dartSdk.context;
+    AnalysisContext sdkContext =
+        driver.analysisDriver.sourceFactory.dartSdk.context;
     expect(sdkContext.analysisOptions.strongMode, isTrue);
   }
 
@@ -943,13 +944,13 @@
   test_previewDart2() async {
     await drive('data/options_tests_project/test_file.dart',
         args: ['--preview-dart-2']);
-    expect(driver.context.analysisOptions.useFastaParser, isFalse);
+    expect(analysisOptions.useFastaParser, isFalse);
   }
 
   test_strongSdk() async {
     String testDir = path.join(testDirectory, 'data', 'strong_sdk');
     await drive(path.join(testDir, 'main.dart'), args: ['--strong']);
-    expect(driver.context.analysisOptions.strongMode, isTrue);
+    expect(analysisOptions.strongMode, isTrue);
     expect(outSink.toString(), contains('No issues found'));
   }
 
diff --git a/pkg/analyzer_plugin/doc/api.html b/pkg/analyzer_plugin/doc/api.html
index e0d511d..dfe6470 100644
--- a/pkg/analyzer_plugin/doc/api.html
+++ b/pkg/analyzer_plugin/doc/api.html
@@ -1280,7 +1280,7 @@
       An enumeration of the kinds of folding regions.
     </p>
     
-  <dl><dt class="value">ANNOTATIONS</dt><dt class="value">CLASS_BODY</dt><dt class="value">DIRECTIVES</dt><dt class="value">DOCUMENTATION_COMMENT</dt><dt class="value">FILE_HEADER</dt><dt class="value">FUNCTION_BODY</dt></dl></dd><dt class="typeDefinition"><a name="type_FoldingRegion">FoldingRegion: object</a></dt><dd>
+  <dl><dt class="value">ANNOTATIONS</dt><dt class="value">CLASS_BODY</dt><dt class="value">DIRECTIVES</dt><dt class="value">DOCUMENTATION_COMMENT</dt><dt class="value">FILE_HEADER</dt><dt class="value">FUNCTION_BODY</dt><dt class="value">INVOCATION</dt><dt class="value">LITERAL</dt></dl></dd><dt class="typeDefinition"><a name="type_FoldingRegion">FoldingRegion: object</a></dt><dd>
     <p>
       A description of a region that can be folded.
     </p>
diff --git a/pkg/analyzer_plugin/lib/plugin/assist_mixin.dart b/pkg/analyzer_plugin/lib/plugin/assist_mixin.dart
index 1b1d3a0..1ba1714 100644
--- a/pkg/analyzer_plugin/lib/plugin/assist_mixin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/assist_mixin.dart
@@ -38,6 +38,8 @@
   @override
   Future<EditGetAssistsResult> handleEditGetAssists(
       EditGetAssistsParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String path = parameters.file;
     AssistRequest request = await getAssistRequest(parameters);
     AssistGenerator generator =
@@ -61,6 +63,8 @@
   @override
   Future<AssistRequest> getAssistRequest(
       EditGetAssistsParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String path = parameters.file;
     ResolveResult result = await getResolveResult(path);
     return new DartAssistRequestImpl(
diff --git a/pkg/analyzer_plugin/lib/plugin/completion_mixin.dart b/pkg/analyzer_plugin/lib/plugin/completion_mixin.dart
index 0194e44..8b45068 100644
--- a/pkg/analyzer_plugin/lib/plugin/completion_mixin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/completion_mixin.dart
@@ -39,6 +39,8 @@
   @override
   Future<CompletionGetSuggestionsResult> handleCompletionGetSuggestions(
       CompletionGetSuggestionsParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String path = parameters.file;
     CompletionRequest request = await getCompletionRequest(parameters);
     CompletionGenerator generator =
@@ -64,6 +66,8 @@
   @override
   Future<CompletionRequest> getCompletionRequest(
       CompletionGetSuggestionsParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     ResolveResult result = await getResolveResult(parameters.file);
     return new DartCompletionRequestImpl(
         resourceProvider, parameters.offset, result);
diff --git a/pkg/analyzer_plugin/lib/plugin/fix_mixin.dart b/pkg/analyzer_plugin/lib/plugin/fix_mixin.dart
index 0ceedfc..16899f4 100644
--- a/pkg/analyzer_plugin/lib/plugin/fix_mixin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/fix_mixin.dart
@@ -27,6 +27,8 @@
 abstract class DartFixesMixin implements FixesMixin {
   @override
   Future<FixesRequest> getFixesRequest(EditGetFixesParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String path = parameters.file;
     int offset = parameters.offset;
     ResolveResult result = await getResolveResult(path);
@@ -69,6 +71,8 @@
   @override
   Future<EditGetFixesResult> handleEditGetFixes(
       EditGetFixesParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String path = parameters.file;
     FixesRequest request = await getFixesRequest(parameters);
     FixGenerator generator = new FixGenerator(getFixContributors(path));
diff --git a/pkg/analyzer_plugin/lib/plugin/folding_mixin.dart b/pkg/analyzer_plugin/lib/plugin/folding_mixin.dart
index bfc8182..6f90671 100644
--- a/pkg/analyzer_plugin/lib/plugin/folding_mixin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/folding_mixin.dart
@@ -25,6 +25,8 @@
 abstract class DartFoldingMixin implements FoldingMixin {
   @override
   Future<FoldingRequest> getFoldingRequest(String path) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     ResolveResult result = await getResolveResult(path);
     return new DartFoldingRequestImpl(resourceProvider, result);
   }
@@ -54,6 +56,8 @@
 
   @override
   Future<Null> sendFoldingNotification(String path) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     try {
       FoldingRequest request = await getFoldingRequest(path);
       FoldingGenerator generator =
diff --git a/pkg/analyzer_plugin/lib/plugin/highlights_mixin.dart b/pkg/analyzer_plugin/lib/plugin/highlights_mixin.dart
index 2a3e04b..01b7ed8 100644
--- a/pkg/analyzer_plugin/lib/plugin/highlights_mixin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/highlights_mixin.dart
@@ -25,6 +25,8 @@
 abstract class DartHighlightsMixin implements HighlightsMixin {
   @override
   Future<HighlightsRequest> getHighlightsRequest(String path) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     ResolveResult result = await getResolveResult(path);
     return new DartHighlightsRequestImpl(resourceProvider, result);
   }
@@ -54,6 +56,8 @@
 
   @override
   Future<Null> sendHighlightsNotification(String path) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     try {
       HighlightsRequest request = await getHighlightsRequest(path);
       HighlightsGenerator generator =
diff --git a/pkg/analyzer_plugin/lib/plugin/kythe_mixin.dart b/pkg/analyzer_plugin/lib/plugin/kythe_mixin.dart
index 3db9fbb..6f96c1d 100644
--- a/pkg/analyzer_plugin/lib/plugin/kythe_mixin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/kythe_mixin.dart
@@ -27,6 +27,8 @@
   @override
   Future<EntryRequest> getEntryRequest(
       KytheGetKytheEntriesParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String path = parameters.file;
     ResolveResult result = await getResolveResult(path);
     return new DartEntryRequestImpl(resourceProvider, result);
@@ -58,6 +60,8 @@
   @override
   Future<KytheGetKytheEntriesResult> handleKytheGetKytheEntries(
       KytheGetKytheEntriesParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String path = parameters.file;
     EntryRequest request = await getEntryRequest(parameters);
     EntryGenerator generator = new EntryGenerator(getEntryContributors(path));
diff --git a/pkg/analyzer_plugin/lib/plugin/navigation_mixin.dart b/pkg/analyzer_plugin/lib/plugin/navigation_mixin.dart
index f8cb90a..86b6f0c 100644
--- a/pkg/analyzer_plugin/lib/plugin/navigation_mixin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/navigation_mixin.dart
@@ -27,6 +27,8 @@
   @override
   Future<NavigationRequest> getNavigationRequest(
       AnalysisGetNavigationParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String path = parameters.file;
     ResolveResult result = await getResolveResult(path);
     int offset = parameters.offset;
@@ -66,6 +68,8 @@
   @override
   Future<AnalysisGetNavigationResult> handleAnalysisGetNavigation(
       AnalysisGetNavigationParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String path = parameters.file;
     NavigationRequest request = await getNavigationRequest(parameters);
     NavigationGenerator generator =
@@ -82,6 +86,8 @@
    */
   @override
   Future<Null> sendNavigationNotification(String path) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     try {
       NavigationRequest request = await getNavigationRequest(
           new AnalysisGetNavigationParams(path, -1, -1));
diff --git a/pkg/analyzer_plugin/lib/plugin/occurrences_mixin.dart b/pkg/analyzer_plugin/lib/plugin/occurrences_mixin.dart
index 98cb50b..dfb95d4 100644
--- a/pkg/analyzer_plugin/lib/plugin/occurrences_mixin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/occurrences_mixin.dart
@@ -25,6 +25,8 @@
 abstract class DartOccurrencesMixin implements OccurrencesMixin {
   @override
   Future<OccurrencesRequest> getOccurrencesRequest(String path) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     ResolveResult result = await getResolveResult(path);
     return new DartOccurrencesRequestImpl(resourceProvider, result);
   }
@@ -54,6 +56,8 @@
 
   @override
   Future<Null> sendOccurrencesNotification(String path) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     try {
       OccurrencesRequest request = await getOccurrencesRequest(path);
       OccurrencesGenerator generator =
diff --git a/pkg/analyzer_plugin/lib/plugin/outline_mixin.dart b/pkg/analyzer_plugin/lib/plugin/outline_mixin.dart
index c72cec6..23506fd 100644
--- a/pkg/analyzer_plugin/lib/plugin/outline_mixin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/outline_mixin.dart
@@ -25,6 +25,8 @@
 abstract class DartOutlineMixin implements OutlineMixin {
   @override
   Future<OutlineRequest> getOutlineRequest(String path) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     ResolveResult result = await getResolveResult(path);
     return new DartOutlineRequestImpl(resourceProvider, result);
   }
@@ -54,6 +56,8 @@
 
   @override
   Future<Null> sendOutlineNotification(String path) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     try {
       OutlineRequest request = await getOutlineRequest(path);
       OutlineGenerator generator =
diff --git a/pkg/analyzer_plugin/lib/plugin/plugin.dart b/pkg/analyzer_plugin/lib/plugin/plugin.dart
index faf50d2..7a6e478 100644
--- a/pkg/analyzer_plugin/lib/plugin/plugin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/plugin.dart
@@ -209,6 +209,8 @@
    * associated with the file is not an [AnalysisDriver].
    */
   Future<ResolveResult> getResolveResult(String path) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     AnalysisDriverGeneric driver = driverForPath(path);
     if (driver is! AnalysisDriver) {
       // Return an error from the request.
@@ -232,6 +234,8 @@
    */
   Future<AnalysisGetNavigationResult> handleAnalysisGetNavigation(
       AnalysisGetNavigationParams params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return new AnalysisGetNavigationResult(
         <String>[], <NavigationTarget>[], <NavigationRegion>[]);
   }
@@ -243,6 +247,8 @@
    */
   Future<AnalysisHandleWatchEventsResult> handleAnalysisHandleWatchEvents(
       AnalysisHandleWatchEventsParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     for (WatchEvent event in parameters.events) {
       switch (event.type) {
         case WatchEventType.ADD:
@@ -269,6 +275,8 @@
    */
   Future<AnalysisSetContextRootsResult> handleAnalysisSetContextRoots(
       AnalysisSetContextRootsParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<ContextRoot> contextRoots = parameters.roots;
     List<ContextRoot> oldRoots = driverMap.keys.toList();
     for (ContextRoot contextRoot in contextRoots) {
@@ -300,6 +308,8 @@
    */
   Future<AnalysisSetPriorityFilesResult> handleAnalysisSetPriorityFiles(
       AnalysisSetPriorityFilesParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<String> files = parameters.files;
     Map<AnalysisDriverGeneric, List<String>> filesByDriver =
         <AnalysisDriverGeneric, List<String>>{};
@@ -326,6 +336,8 @@
    */
   Future<AnalysisSetSubscriptionsResult> handleAnalysisSetSubscriptions(
       AnalysisSetSubscriptionsParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     Map<AnalysisService, List<String>> subscriptions = parameters.subscriptions;
     Map<String, List<AnalysisService>> newSubscriptions =
         subscriptionManager.setSubscriptions(subscriptions);
@@ -342,6 +354,8 @@
    */
   Future<AnalysisUpdateContentResult> handleAnalysisUpdateContent(
       AnalysisUpdateContentParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     Map<String, Object> files = parameters.files;
     files.forEach((String filePath, Object overlay) {
       if (overlay is AddContentOverlay) {
@@ -376,9 +390,12 @@
    * Throw a [RequestFailure] if the request could not be handled.
    */
   Future<CompletionGetSuggestionsResult> handleCompletionGetSuggestions(
-          CompletionGetSuggestionsParams parameters) async =>
-      new CompletionGetSuggestionsResult(
-          -1, -1, const <CompletionSuggestion>[]);
+      CompletionGetSuggestionsParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
+    return new CompletionGetSuggestionsResult(
+        -1, -1, const <CompletionSuggestion>[]);
+  }
 
   /**
    * Handle an 'edit.getAssists' request.
@@ -386,8 +403,11 @@
    * Throw a [RequestFailure] if the request could not be handled.
    */
   Future<EditGetAssistsResult> handleEditGetAssists(
-          EditGetAssistsParams parameters) async =>
-      new EditGetAssistsResult(const <PrioritizedSourceChange>[]);
+      EditGetAssistsParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
+    return new EditGetAssistsResult(const <PrioritizedSourceChange>[]);
+  }
 
   /**
    * Handle an 'edit.getAvailableRefactorings' request. Subclasses that override
@@ -397,8 +417,11 @@
    * Throw a [RequestFailure] if the request could not be handled.
    */
   Future<EditGetAvailableRefactoringsResult> handleEditGetAvailableRefactorings(
-          EditGetAvailableRefactoringsParams parameters) async =>
-      new EditGetAvailableRefactoringsResult(const <RefactoringKind>[]);
+      EditGetAvailableRefactoringsParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
+    return new EditGetAvailableRefactoringsResult(const <RefactoringKind>[]);
+  }
 
   /**
    * Handle an 'edit.getFixes' request.
@@ -406,8 +429,11 @@
    * Throw a [RequestFailure] if the request could not be handled.
    */
   Future<EditGetFixesResult> handleEditGetFixes(
-          EditGetFixesParams parameters) async =>
-      new EditGetFixesResult(const <AnalysisErrorFixes>[]);
+      EditGetFixesParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
+    return new EditGetFixesResult(const <AnalysisErrorFixes>[]);
+  }
 
   /**
    * Handle an 'edit.getRefactoring' request.
@@ -415,8 +441,10 @@
    * Throw a [RequestFailure] if the request could not be handled.
    */
   Future<EditGetRefactoringResult> handleEditGetRefactoring(
-          EditGetRefactoringParams parameters) async =>
-      null;
+      EditGetRefactoringParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    return await null;
+  }
 
   /**
    * Handle a 'kythe.getKytheEntries' request.
@@ -424,8 +452,10 @@
    * Throw a [RequestFailure] if the request could not be handled.
    */
   Future<KytheGetKytheEntriesResult> handleKytheGetKytheEntries(
-          KytheGetKytheEntriesParams parameters) async =>
-      null;
+      KytheGetKytheEntriesParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    return await null;
+  }
 
   /**
    * Handle a 'plugin.shutdown' request. Subclasses can override this method to
@@ -435,8 +465,11 @@
    * Throw a [RequestFailure] if the request could not be handled.
    */
   Future<PluginShutdownResult> handlePluginShutdown(
-          PluginShutdownParams parameters) async =>
-      new PluginShutdownResult();
+      PluginShutdownParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
+    return new PluginShutdownResult();
+  }
 
   /**
    * Handle a 'plugin.versionCheck' request.
@@ -445,6 +478,8 @@
    */
   Future<PluginVersionCheckResult> handlePluginVersionCheck(
       PluginVersionCheckParams parameters) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     String byteStorePath = parameters.byteStorePath;
     String sdkPath = parameters.sdkPath;
     String versionString = parameters.version;
@@ -589,6 +624,8 @@
    * `null` if the response has already been sent.
    */
   Future<Response> _getResponse(Request request, int requestTime) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     ResponseResult result = null;
     switch (request.method) {
       case ANALYSIS_REQUEST_GET_NAVIGATION:
@@ -663,6 +700,8 @@
    * server.
    */
   Future<Null> _onRequest(Request request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     int requestTime = new DateTime.now().millisecondsSinceEpoch;
     String id = request.id;
     Response response;
diff --git a/pkg/analyzer_plugin/lib/protocol/protocol_common.dart b/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
index e724ab7..a6b6812 100644
--- a/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
+++ b/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
@@ -1969,6 +1969,8 @@
  *   DOCUMENTATION_COMMENT
  *   FILE_HEADER
  *   FUNCTION_BODY
+ *   INVOCATION
+ *   LITERAL
  * }
  *
  * Clients may not extend, implement or mix-in this class.
@@ -1987,6 +1989,10 @@
 
   static const FoldingKind FUNCTION_BODY = const FoldingKind._("FUNCTION_BODY");
 
+  static const FoldingKind INVOCATION = const FoldingKind._("INVOCATION");
+
+  static const FoldingKind LITERAL = const FoldingKind._("LITERAL");
+
   /**
    * A list containing all of the enum values that are defined.
    */
@@ -1996,7 +2002,9 @@
     DIRECTIVES,
     DOCUMENTATION_COMMENT,
     FILE_HEADER,
-    FUNCTION_BODY
+    FUNCTION_BODY,
+    INVOCATION,
+    LITERAL
   ];
 
   @override
@@ -2018,6 +2026,10 @@
         return FILE_HEADER;
       case "FUNCTION_BODY":
         return FUNCTION_BODY;
+      case "INVOCATION":
+        return INVOCATION;
+      case "LITERAL":
+        return LITERAL;
     }
     throw new Exception('Illegal enum value: $name');
   }
diff --git a/pkg/analyzer_plugin/lib/src/channel/isolate_channel.dart b/pkg/analyzer_plugin/lib/src/channel/isolate_channel.dart
index 2ab6bc1..2c4e8c7 100644
--- a/pkg/analyzer_plugin/lib/src/channel/isolate_channel.dart
+++ b/pkg/analyzer_plugin/lib/src/channel/isolate_channel.dart
@@ -229,6 +229,8 @@
   Future<Null> listen(void onResponse(Response response),
       void onNotification(Notification notification),
       {Function onError, void onDone()}) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (_isolate != null) {
       throw new StateError('Cannot listen to the same channel more than once.');
     }
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
index 807264c..c13ce1e 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
@@ -63,6 +63,8 @@
   @override
   Future<Null> addFileEdit(
       String path, void buildFileEdit(FileEditBuilder builder)) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     FileEditBuilderImpl builder = await createFileEditBuilder(path);
     buildFileEdit(builder);
     _change.addFileEdit(builder.fileEdit);
@@ -74,6 +76,8 @@
    * the file with the given [path] and [timeStamp].
    */
   Future<FileEditBuilderImpl> createFileEditBuilder(String path) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     return new FileEditBuilderImpl(this, path, 0);
   }
 
@@ -333,6 +337,8 @@
    * Finalize the source file edit that is being built.
    */
   Future<Null> finalize() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     // Nothing to do.
   }
 
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
index ef91dc7..ab29122 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
@@ -53,6 +53,8 @@
 
   @override
   Future<DartFileEditBuilderImpl> createFileEditBuilder(String path) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     ResolveResult result = await session.getResolvedAst(path);
     ResultState state = result?.state ?? ResultState.INVALID_FILE_TYPE;
     if (state == ResultState.INVALID_FILE_TYPE) {
@@ -1153,6 +1155,8 @@
 
   @override
   Future<Null> finalize() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     if (librariesToImport.isNotEmpty) {
       CompilationUnitElement definingUnitElement =
           libraryElement.definingCompilationUnit;
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/completion_core.dart b/pkg/analyzer_plugin/lib/utilities/completion/completion_core.dart
index bb2b3c8..691a179 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/completion_core.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/completion_core.dart
@@ -99,6 +99,8 @@
    */
   Future<GeneratorResult> generateCompletionResponse(
       CompletionRequest request) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     List<Notification> notifications = <Notification>[];
     CompletionCollectorImpl collector = new CompletionCollectorImpl();
     try {
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart b/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart
index a983d5d..1d10d441 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart
@@ -42,6 +42,8 @@
   @override
   Future<Null> computeSuggestions(
       DartCompletionRequest request, CompletionCollector collector) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     CompletionTarget target =
         new CompletionTarget.forOffset(request.result.unit, request.offset);
     OpType optype = new OpType.forCompletion(target, request.offset);
@@ -69,6 +71,8 @@
     CompletionTarget target,
     OpType optype,
   }) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     target ??= new CompletionTarget.forOffset(
         request.result.unit, request.offset,
         entryPoint: entryPoint);
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart b/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
index ef70ec2..c925695 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
@@ -31,6 +31,8 @@
   @override
   Future<Null> computeSuggestions(
       DartCompletionRequest request, CompletionCollector collector) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     LibraryElement containingLibrary = request.result.libraryElement;
     // Gracefully degrade if the library element is not resolved
     // e.g. detached part file or source change
@@ -51,6 +53,8 @@
    */
   Future<Null> computeSuggestionsWithEntryPoint(DartCompletionRequest request,
       CompletionCollector collector, AstNode entryPoint) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
     LibraryElement containingLibrary = request.result.libraryElement;
     // Gracefully degrade if the library element is not resolved
     // e.g. detached part file or source change
diff --git a/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart b/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart
index 841a96f..cbf5390 100644
--- a/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart
+++ b/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart
@@ -323,6 +323,8 @@
  *   DOCUMENTATION_COMMENT
  *   FILE_HEADER
  *   FUNCTION_BODY
+ *   INVOCATION
+ *   LITERAL
  * }
  */
 final Matcher isFoldingKind = new MatchesEnum("FoldingKind", [
@@ -331,7 +333,9 @@
   "DIRECTIVES",
   "DOCUMENTATION_COMMENT",
   "FILE_HEADER",
-  "FUNCTION_BODY"
+  "FUNCTION_BODY",
+  "INVOCATION",
+  "LITERAL"
 ]);
 
 /**
diff --git a/pkg/analyzer_plugin/test/plugin/assist_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/assist_mixin_test.dart
index 906a974..41d20c1 100644
--- a/pkg/analyzer_plugin/test/plugin/assist_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/assist_mixin_test.dart
@@ -90,8 +90,7 @@
   @override
   Future<AssistRequest> getAssistRequest(
       EditGetAssistsParams parameters) async {
-    AnalysisResult result = new AnalysisResult(
-        null, null, null, null, null, null, null, null, null, null, null);
+    AnalysisResult result = new MockAnalysisResult();
     return new DartAssistRequestImpl(
         resourceProvider, parameters.offset, parameters.length, result);
   }
diff --git a/pkg/analyzer_plugin/test/plugin/completion_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/completion_mixin_test.dart
index e4fa3e8..acd15aa 100644
--- a/pkg/analyzer_plugin/test/plugin/completion_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/completion_mixin_test.dart
@@ -98,8 +98,7 @@
   @override
   Future<CompletionRequest> getCompletionRequest(
       CompletionGetSuggestionsParams parameters) async {
-    AnalysisResult result = new AnalysisResult(
-        null, null, null, null, null, null, null, null, null, null, null);
+    AnalysisResult result = new MockAnalysisResult();
     return new DartCompletionRequestImpl(
         resourceProvider, parameters.offset, result);
   }
diff --git a/pkg/analyzer_plugin/test/plugin/fix_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/fix_mixin_test.dart
index 08a0e76..a30418e 100644
--- a/pkg/analyzer_plugin/test/plugin/fix_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/fix_mixin_test.dart
@@ -98,8 +98,8 @@
     int offset = parameters.offset;
     AnalysisError error = new AnalysisError(
         new MockSource(), 0, 0, CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT);
-    AnalysisResult result = new AnalysisResult(null, null, null, null, null,
-        null, new LineInfo([0, 20]), null, null, [error], null);
+    AnalysisResult result = new MockAnalysisResult(
+        lineInfo: new LineInfo([0, 20]), errors: [error]);
     return new DartFixesRequestImpl(resourceProvider, offset, [error], result);
   }
 }
diff --git a/pkg/analyzer_plugin/test/plugin/folding_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/folding_mixin_test.dart
index e8e2d46..cedc947 100644
--- a/pkg/analyzer_plugin/test/plugin/folding_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/folding_mixin_test.dart
@@ -93,8 +93,7 @@
 
   @override
   Future<FoldingRequest> getFoldingRequest(String path) async {
-    AnalysisResult result = new AnalysisResult(
-        null, null, path, null, null, null, null, null, null, null, null);
+    AnalysisResult result = new MockAnalysisResult(path: path);
     return new DartFoldingRequestImpl(resourceProvider, result);
   }
 }
diff --git a/pkg/analyzer_plugin/test/plugin/highlights_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/highlights_mixin_test.dart
index f9ee17e..992446f 100644
--- a/pkg/analyzer_plugin/test/plugin/highlights_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/highlights_mixin_test.dart
@@ -93,8 +93,7 @@
 
   @override
   Future<HighlightsRequest> getHighlightsRequest(String path) async {
-    AnalysisResult result = new AnalysisResult(
-        null, null, path, null, null, null, null, null, null, null, null);
+    AnalysisResult result = new MockAnalysisResult(path: path);
     return new DartHighlightsRequestImpl(resourceProvider, result);
   }
 }
diff --git a/pkg/analyzer_plugin/test/plugin/kythe_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/kythe_mixin_test.dart
index a3af883..94f8b4c 100644
--- a/pkg/analyzer_plugin/test/plugin/kythe_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/kythe_mixin_test.dart
@@ -94,8 +94,7 @@
   @override
   Future<EntryRequest> getEntryRequest(
       KytheGetKytheEntriesParams parameters) async {
-    AnalysisResult result = new AnalysisResult(
-        null, null, null, null, null, null, null, null, null, null, null);
+    AnalysisResult result = new MockAnalysisResult();
     return new DartEntryRequestImpl(resourceProvider, result);
   }
 }
diff --git a/pkg/analyzer_plugin/test/plugin/mocks.dart b/pkg/analyzer_plugin/test/plugin/mocks.dart
index 1ccb601..3fffc76 100644
--- a/pkg/analyzer_plugin/test/plugin/mocks.dart
+++ b/pkg/analyzer_plugin/test/plugin/mocks.dart
@@ -5,10 +5,12 @@
 import 'dart:async';
 import 'dart:collection';
 
+import 'package:analyzer/error/error.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
-import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/engine.dart'
+    show AnalysisOptionsImpl, TimestampedData;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/timestamped_data.dart';
 import 'package:analyzer_plugin/channel/channel.dart';
@@ -54,6 +56,22 @@
   Future<Null> performWork() => new Future.value(null);
 }
 
+class MockAnalysisResult implements AnalysisResult {
+  @override
+  final List<AnalysisError> errors;
+
+  @override
+  final LineInfo lineInfo;
+
+  @override
+  final String path;
+
+  MockAnalysisResult({this.errors, this.lineInfo, this.path});
+
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
 class MockChannel implements PluginCommunicationChannel {
   bool _closed = false;
 
diff --git a/pkg/analyzer_plugin/test/plugin/navigation_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/navigation_mixin_test.dart
index 22603d2..35794aee 100644
--- a/pkg/analyzer_plugin/test/plugin/navigation_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/navigation_mixin_test.dart
@@ -109,8 +109,7 @@
   @override
   Future<NavigationRequest> getNavigationRequest(
       AnalysisGetNavigationParams parameters) async {
-    AnalysisResult result = new AnalysisResult(null, null, parameters.file,
-        null, null, null, null, null, null, null, null);
+    AnalysisResult result = new MockAnalysisResult(path: parameters.file);
     return new DartNavigationRequestImpl(
         resourceProvider, parameters.offset, parameters.length, result);
   }
diff --git a/pkg/analyzer_plugin/test/plugin/occurrences_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/occurrences_mixin_test.dart
index ea8a305..a3c076e 100644
--- a/pkg/analyzer_plugin/test/plugin/occurrences_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/occurrences_mixin_test.dart
@@ -120,8 +120,7 @@
 
   @override
   Future<OccurrencesRequest> getOccurrencesRequest(String path) async {
-    AnalysisResult result = new AnalysisResult(
-        null, null, path, null, null, null, null, null, null, null, null);
+    AnalysisResult result = new MockAnalysisResult(path: path);
     return new DartOccurrencesRequestImpl(resourceProvider, result);
   }
 }
diff --git a/pkg/analyzer_plugin/test/plugin/outline_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/outline_mixin_test.dart
index 3291163..70d7620 100644
--- a/pkg/analyzer_plugin/test/plugin/outline_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/outline_mixin_test.dart
@@ -94,8 +94,7 @@
 
   @override
   Future<OutlineRequest> getOutlineRequest(String path) async {
-    AnalysisResult result = new AnalysisResult(
-        null, null, path, null, null, null, null, null, null, null, null);
+    AnalysisResult result = new MockAnalysisResult(path: path);
     return new DartOutlineRequestImpl(resourceProvider, result);
   }
 }
diff --git a/pkg/analyzer_plugin/test/utilities/navigation_test.dart b/pkg/analyzer_plugin/test/utilities/navigation_test.dart
index dc4a9cc..e97fcfd 100644
--- a/pkg/analyzer_plugin/test/utilities/navigation_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/navigation_test.dart
@@ -4,13 +4,14 @@
 
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart' as driver;
 import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
 import 'package:analyzer_plugin/utilities/generator.dart';
 import 'package:analyzer_plugin/utilities/navigation/navigation.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../plugin/mocks.dart';
+
 void main() {
   defineReflectiveTests(NavigationGeneratorTest);
 }
@@ -19,8 +20,7 @@
 class NavigationGeneratorTest {
   MemoryResourceProvider provider = new MemoryResourceProvider();
 
-  ResolveResult resolveResult = new driver.AnalysisResult(
-      null, null, 'a.dart', null, true, '', null, '', null, null, null);
+  ResolveResult resolveResult = new MockAnalysisResult(path: 'a.dart');
 
   test_none() {
     NavigationGenerator generator = new NavigationGenerator([]);
diff --git a/pkg/analyzer_plugin/tool/spec/common_types_spec.html b/pkg/analyzer_plugin/tool/spec/common_types_spec.html
index 7e30303..2b1c9e5 100644
--- a/pkg/analyzer_plugin/tool/spec/common_types_spec.html
+++ b/pkg/analyzer_plugin/tool/spec/common_types_spec.html
@@ -6,7 +6,7 @@
 </head>
 <body>
 <h1>Common Types</h1>
-<version>1.0.1</version>
+<version>1.0.2</version>
 <p>
   This document contains a specification of the types that are common between
   the analysis server wire protocol and the analysis server plugin wire
@@ -539,6 +539,8 @@
       <value><code>DOCUMENTATION_COMMENT</code></value>
       <value><code>FILE_HEADER</code></value>
       <value><code>FUNCTION_BODY</code></value>
+      <value><code>INVOCATION</code></value>
+      <value><code>LITERAL</code></value>
     </enum>
   </type>
   <type name="FoldingRegion">
diff --git a/pkg/compiler/lib/src/backend_strategy.dart b/pkg/compiler/lib/src/backend_strategy.dart
index 0e29978..be1764c 100644
--- a/pkg/compiler/lib/src/backend_strategy.dart
+++ b/pkg/compiler/lib/src/backend_strategy.dart
@@ -11,6 +11,7 @@
 import 'enqueue.dart';
 import 'elements/entities.dart';
 import 'io/source_information.dart';
+import 'js_backend/inferred_data.dart';
 import 'js_backend/js_backend.dart';
 import 'js_backend/native_data.dart';
 import 'js_emitter/sorter.dart';
@@ -55,6 +56,7 @@
   SourceSpan spanFromSpannable(Spannable spannable, Entity currentElement);
 
   /// Creates the [TypesInferrer] used by this strategy.
-  TypesInferrer createTypesInferrer(JClosedWorld closedWorld,
+  TypesInferrer createTypesInferrer(
+      JClosedWorld closedWorld, InferredDataBuilder inferredDataBuilder,
       {bool disableTypeInference: false});
 }
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 4a8bc14..8f31433 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -29,6 +29,7 @@
 import 'inferrer/typemasks/masks.dart' show TypeMaskStrategy;
 import 'io/source_information.dart' show SourceInformation;
 import 'js_backend/backend.dart' show JavaScriptBackend;
+import 'js_backend/inferred_data.dart';
 import 'kernel/kernel_backend_strategy.dart';
 import 'kernel/kernel_strategy.dart';
 import 'library_loader.dart' show LibraryLoaderTask, LoadedLibraries;
@@ -376,8 +377,10 @@
         mainFunction = closedWorld.elementEnvironment.mainFunction;
 
         reporter.log('Inferring types...');
-        globalInference.runGlobalTypeInference(mainFunction, closedWorld);
-        closedWorld.computeSideEffects();
+        InferredDataBuilder inferredDataBuilder = new InferredDataBuilderImpl();
+        backend.processAnnotations(closedWorld, inferredDataBuilder);
+        globalInference.runGlobalTypeInference(
+            mainFunction, closedWorld, inferredDataBuilder);
 
         if (stopAfterTypeInference) return;
 
@@ -423,9 +426,6 @@
     OutputUnitData result = deferredLoadTask.run(mainFunction, closedWorld);
     JClosedWorld closedWorldRefiner =
         backendStrategy.createJClosedWorld(closedWorld);
-    // Compute whole-program-knowledge that the backend needs. (This might
-    // require the information computed in [world.closeWorld].)
-    backend.onResolutionClosedWorld(closedWorldRefiner);
 
     backend.onDeferredLoadComplete(result);
 
diff --git a/pkg/compiler/lib/src/dump_info.dart b/pkg/compiler/lib/src/dump_info.dart
index 15950a1..7abea41 100644
--- a/pkg/compiler/lib/src/dump_info.dart
+++ b/pkg/compiler/lib/src/dump_info.dart
@@ -286,7 +286,8 @@
     String returnType = '${functionType.returnType}';
 
     String inferredReturnType = '${_resultOfMember(function).returnType}';
-    String sideEffects = '${closedWorld.getSideEffectsOfElement(function)}';
+    String sideEffects =
+        '${compiler.globalInference.inferredData.getSideEffectsOfElement(function)}';
 
     int inlinedCount = compiler.dumpInfoTask.inlineCount[function];
     if (inlinedCount == null) inlinedCount = 0;
diff --git a/pkg/compiler/lib/src/frontend_strategy.dart b/pkg/compiler/lib/src/frontend_strategy.dart
index 8f915bf..f6b8293 100644
--- a/pkg/compiler/lib/src/frontend_strategy.dart
+++ b/pkg/compiler/lib/src/frontend_strategy.dart
@@ -14,6 +14,7 @@
 import 'elements/entities.dart';
 import 'elements/types.dart';
 import 'enqueue.dart';
+import 'js_backend/allocator_analysis.dart' show KAllocatorAnalysis;
 import 'js_backend/backend_usage.dart';
 import 'js_backend/interceptor_data.dart';
 import 'js_backend/native_data.dart';
@@ -70,6 +71,7 @@
       InterceptorDataBuilder interceptorDataBuilder,
       BackendUsageBuilder backendUsageBuilder,
       RuntimeTypesNeedBuilder rtiNeedBuilder,
+      KAllocatorAnalysis allocatorAnalysis,
       NativeResolutionEnqueuer nativeResolutionEnqueuer,
       NoSuchMethodRegistry noSuchMethodRegistry,
       SelectorConstraintsStrategy selectorConstraintsStrategy,
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index d8c13d6..fe24043 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -81,7 +81,8 @@
         // TODO(johnniwinther): Should side effects also be tracked for field
         // initializers?
         this._sideEffectsBuilder = _analyzedMember is FunctionEntity
-            ? _inferrer.closedWorld.getSideEffectsBuilder(_analyzedMember)
+            ? _inferrer.inferredDataBuilder
+                .getSideEffectsBuilder(_analyzedMember)
             : new SideEffectsBuilder.free(_analyzedMember),
         this._inGenerativeConstructor = _analyzedNode is ir.Constructor {
     if (_locals != null) return;
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
index 77622dd..5b45c23 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
+++ b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
@@ -13,6 +13,7 @@
 import '../elements/entities.dart';
 import '../elements/names.dart';
 import '../js_backend/annotations.dart' as optimizerHints;
+import '../js_backend/inferred_data.dart';
 import '../js_backend/no_such_method_registry.dart';
 import '../js_emitter/sorter.dart';
 import '../native/behavior.dart' as native;
@@ -65,6 +66,7 @@
 
   TypeSystem<T> get types;
   Map<T, TypeInformation> get concreteTypes;
+  InferredDataBuilder get inferredDataBuilder;
 
   FunctionEntity get mainElement;
 
@@ -268,6 +270,7 @@
 
   /// The [JClosedWorld] on which inference reasoning is based.
   final JClosedWorld closedWorld;
+  final InferredDataBuilder inferredDataBuilder;
 
   final TypeSystem<T> types;
   final Map<T, TypeInformation> concreteTypes = new Map<T, TypeInformation>();
@@ -295,6 +298,7 @@
       this.noSuchMethodRegistry,
       this.mainElement,
       this.sorter,
+      this.inferredDataBuilder,
       TypeSystemStrategy<T> typeSystemStrategy)
       : this.types = new TypeSystem<T>(closedWorld, typeSystemStrategy);
 
@@ -342,7 +346,8 @@
     } else if (callee.isGetter && !selector.isGetter) {
       sideEffectsBuilder.setAllSideEffectsAndDependsOnSomething();
     } else {
-      sideEffectsBuilder.addInput(closedWorld.getSideEffectsBuilder(callee));
+      sideEffectsBuilder
+          .addInput(inferredDataBuilder.getSideEffectsBuilder(callee));
     }
   }
 
@@ -502,7 +507,7 @@
         tracer.run();
         if (!tracer.continueAnalyzing) {
           elements.forEach((FunctionEntity element) {
-            closedWorld.registerMightBePassedToApply(element);
+            inferredDataBuilder.registerMightBePassedToApply(element);
             if (debug.VERBOSE) {
               print("traced closure $element as ${true} (bail)");
             }
@@ -525,11 +530,11 @@
             workQueue.add(info);
           });
           if (tracer.tracedType.mightBePassedToFunctionApply) {
-            closedWorld.registerMightBePassedToApply(element);
+            inferredDataBuilder.registerMightBePassedToApply(element);
           }
           if (debug.VERBOSE) {
             print("traced closure $element as "
-                "${closedWorld
+                "${inferredDataBuilder
                 .getCurrentlyKnownMightBePassedToApply(element)}");
           }
         });
@@ -762,7 +767,7 @@
       }
       if (info is StaticCallSiteTypeInformation) {
         MemberEntity member = info.calledElement;
-        closedWorld.addFunctionCalledInLoop(member);
+        inferredDataBuilder.addFunctionCalledInLoop(member);
       } else if (info.mask != null &&
           !abstractValueDomain.containsAll(info.mask)) {
         // For instance methods, we only register a selector called in a
@@ -770,7 +775,7 @@
         // methods as being called from within a loop. This cuts down
         // on the code bloat.
         info.callees.forEach((MemberEntity element) {
-          closedWorld.addFunctionCalledInLoop(element);
+          inferredDataBuilder.addFunctionCalledInLoop(element);
         });
       }
     });
diff --git a/pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart
index ef1f1bc..07d745f 100644
--- a/pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart
+++ b/pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart
@@ -13,6 +13,7 @@
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart';
+import '../js_backend/inferred_data.dart';
 import '../js_backend/no_such_method_registry.dart';
 import '../js_emitter/sorter.dart';
 import '../js_model/locals.dart';
@@ -32,9 +33,15 @@
   final KernelToElementMapForBuilding _elementMap;
   final GlobalLocalsMap _globalLocalsMap;
   final ClosureDataLookup<ir.Node> _closureDataLookup;
+  final InferredDataBuilder _inferredDataBuilder;
 
-  KernelTypeGraphInferrer(this._compiler, this._elementMap,
-      this._globalLocalsMap, this._closureDataLookup, JClosedWorld closedWorld,
+  KernelTypeGraphInferrer(
+      this._compiler,
+      this._elementMap,
+      this._globalLocalsMap,
+      this._closureDataLookup,
+      JClosedWorld closedWorld,
+      this._inferredDataBuilder,
       {bool disableTypeInference: false})
       : super(closedWorld, disableTypeInference: disableTypeInference);
 
@@ -51,7 +58,8 @@
         closedWorld,
         _compiler.backend.noSuchMethodRegistry,
         main,
-        _compiler.backendStrategy.sorter);
+        _compiler.backendStrategy.sorter,
+        _inferredDataBuilder);
   }
 
   @override
@@ -101,7 +109,8 @@
       JClosedWorld closedWorld,
       NoSuchMethodRegistry noSuchMethodRegistry,
       FunctionEntity mainElement,
-      Sorter sorter)
+      Sorter sorter,
+      InferredDataBuilder inferredDataBuilder)
       : super(
             options,
             progress,
@@ -111,6 +120,7 @@
             noSuchMethodRegistry,
             mainElement,
             sorter,
+            inferredDataBuilder,
             new KernelTypeSystemStrategy(
                 _elementMap, _globalLocalsMap, _closureDataLookup));
 
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
index ce1cc11..dc903fc 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
@@ -770,7 +770,8 @@
       giveUp(inferrer);
       return safeType(inferrer);
     }
-    if (inferrer.closedWorld.getCurrentlyKnownMightBePassedToApply(_method)) {
+    if (inferrer.inferredDataBuilder
+        .getCurrentlyKnownMightBePassedToApply(_method)) {
       giveUp(inferrer);
       return safeType(inferrer);
     }
diff --git a/pkg/compiler/lib/src/io/source_information.dart b/pkg/compiler/lib/src/io/source_information.dart
index 5cbb473..59e9b2e 100644
--- a/pkg/compiler/lib/src/io/source_information.dart
+++ b/pkg/compiler/lib/src/io/source_information.dart
@@ -43,7 +43,7 @@
   /// Create a [SourceInformationBuilder] for [member].
   SourceInformationBuilder<T> createBuilderForContext(
       covariant MemberEntity member) {
-    return const SourceInformationBuilder();
+    return new SourceInformationBuilder<T>();
   }
 
   /// Generate [SourceInformation] marker for non-preamble code.
diff --git a/pkg/compiler/lib/src/js_backend/allocator_analysis.dart b/pkg/compiler/lib/src/js_backend/allocator_analysis.dart
new file mode 100644
index 0000000..d57a0a0
--- /dev/null
+++ b/pkg/compiler/lib/src/js_backend/allocator_analysis.dart
@@ -0,0 +1,124 @@
+// 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:kernel/ast.dart' as ir;
+
+import '../constants/values.dart';
+import '../js_model/elements.dart' show JsToFrontendMap, JField;
+import '../kernel/element_map.dart';
+import '../kernel/element_map_impl.dart' show KernelElementEnvironment;
+import '../kernel/kelements.dart' show KClass, KField;
+import '../options.dart';
+
+abstract class AllocatorAnalysis {}
+
+/// AllocatorAnalysis
+///
+/// Analysis to determine features of the allocator functions. The allocator
+/// function takes parameters for each field initializer and initializes the
+/// fields.  Parameters may be omitted if the initializer is always the same
+/// constant value.  How the allocator is emitted will determine what kind of
+/// constants can be handled.  The initial implementation only permits `null`.
+
+// TODO(sra): Analysis to determine field order. Current field order is
+// essentially declaration order, subclass first. We can reorder fields so that
+// fields initialized with the same constant are together to allow chained
+// initialization. Fields of a class and superclass can be reordered to allow
+// chaining, e.g.
+//
+//     this.x = this.z = null;
+//
+class KAllocatorAnalysis implements AllocatorAnalysis {
+  final KernelElementEnvironment _elementEnvironment;
+  KernelToElementMap _elementMap;
+
+  final Map<KField, ConstantValue> _fixedInitializers =
+      <KField, ConstantValue>{};
+
+  KAllocatorAnalysis(this._elementEnvironment) {
+    _elementMap = _elementEnvironment.elementMap;
+  }
+
+  // Register class during resolution. Use simple syntactic analysis to find
+  // null-initialized fields.
+  void registerInstantiatedClass(KClass class_) {
+    ClassDefinition definition = _elementMap.getClassDefinition(class_);
+    assert(definition.kind == ClassKind.regular);
+    ir.Class classNode = definition.node;
+
+    Set<ir.Field> nulls = new Set<ir.Field>();
+    for (ir.Field field in classNode.fields) {
+      if (!field.isInstanceMember) continue;
+      ir.Expression initializer = field.initializer;
+      if (initializer == null || initializer is ir.NullLiteral) {
+        nulls.add(field);
+      }
+    }
+
+    for (ir.Constructor constructor in classNode.constructors) {
+      for (ir.Initializer initializer in constructor.initializers) {
+        if (initializer is ir.FieldInitializer) {
+          // TODO(sra): Check explicit initializer value to see if consistent
+          // over all constructors.
+          nulls.remove(initializer.field);
+        }
+      }
+    }
+
+    for (var fieldNode in nulls) {
+      _fixedInitializers[_elementMap.getField(fieldNode)] =
+          const NullConstantValue();
+    }
+  }
+}
+
+class JAllocatorAnalysis implements AllocatorAnalysis {
+  // --csp and --fast-startup have different constraints to the generated code.
+  final CompilerOptions _options;
+  final Map<JField, ConstantValue> _fixedInitializers =
+      <JField, ConstantValue>{};
+
+  JAllocatorAnalysis._(this._options);
+
+  static JAllocatorAnalysis from(KAllocatorAnalysis kAnalysis,
+      JsToFrontendMap map, CompilerOptions options) {
+    var result = new JAllocatorAnalysis._(options);
+
+    kAnalysis._fixedInitializers.forEach((KField kField, ConstantValue value) {
+      // TODO(sra): Translate constant, but Null does not need translating.
+      if (value.isNull) {
+        JField jField = map.toBackendMember(kField);
+        if (jField != null) {
+          result._fixedInitializers[jField] = value;
+        }
+      }
+    });
+
+    return result;
+  }
+
+  bool get _isEnabled {
+    if (_options.useContentSecurityPolicy && !_options.useStartupEmitter) {
+      // TODO(sra): Refactor csp 'precompiled' constructor generation to allow
+      // in-allocator initialization.
+      return false;
+    }
+    if (!_options.strongMode) return false;
+    return true;
+  }
+  // TODO(sra): Add way to let injected fields be initialized to a constant in
+  // allocator.
+
+  bool isInitializedInAllocator(JField field) {
+    if (!_isEnabled) return false;
+    return _fixedInitializers[field] != null;
+  }
+
+  /// Return constant for a field initialized in allocator. Returns `null` for
+  /// fields not initialized in allocator.
+  ConstantValue initializerValue(JField field) {
+    assert(_isEnabled);
+    return _fixedInitializers[field];
+  }
+}
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index c06c5f0..bacfc5e 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -47,6 +47,7 @@
     show ImpactStrategy, ImpactUseCase, WorldImpact, WorldImpactVisitor;
 import '../util/util.dart';
 import '../world.dart' show JClosedWorld;
+import 'allocator_analysis.dart';
 import 'annotations.dart' as optimizerHints;
 import 'backend_impact.dart';
 import 'backend_usage.dart';
@@ -56,6 +57,7 @@
 import 'custom_elements_analysis.dart';
 import 'enqueuer.dart';
 import 'impact_transformer.dart';
+import 'inferred_data.dart';
 import 'interceptor_data.dart';
 import 'js_interop_analysis.dart' show JsInteropAnalysis;
 import 'namer.dart';
@@ -363,6 +365,8 @@
   /// constructors for custom elements.
   CustomElementsCodegenAnalysis _customElementsCodegenAnalysis;
 
+  KAllocatorAnalysis _allocatorResolutionAnalysis;
+
   /// Codegen support for typed JavaScript interop.
   JsInteropAnalysis jsInteropAnalysis;
 
@@ -545,11 +549,6 @@
         frontendStrategy.nativeBasicData, nativeDataBuilder);
   }
 
-  /// Called when the closed world from resolution has been computed.
-  void onResolutionClosedWorld(JClosedWorld closedWorld) {
-    processAnnotations(closedWorld);
-  }
-
   void onDeferredLoadComplete(OutputUnitData data) {
     _outputUnitData = compiler.backendStrategy.convertOutputUnitData(data);
   }
@@ -577,6 +576,7 @@
         commonElements,
         nativeBasicData,
         _backendUsageBuilder);
+    _allocatorResolutionAnalysis = new KAllocatorAnalysis(elementEnvironment);
     ClassQueries classQueries = compiler.frontendStrategy.createClassQueries();
     ClassHierarchyBuilder classHierarchyBuilder =
         new ClassHierarchyBuilder(commonElements, classQueries);
@@ -612,6 +612,7 @@
             noSuchMethodRegistry,
             customElementsResolutionAnalysis,
             _nativeResolutionEnqueuer,
+            _allocatorResolutionAnalysis,
             compiler.deferredLoadTask),
         compiler.frontendStrategy.createResolutionWorldBuilder(
             nativeBasicData,
@@ -619,6 +620,7 @@
             interceptorDataBuilder,
             _backendUsageBuilder,
             rtiNeedBuilder,
+            _allocatorResolutionAnalysis,
             _nativeResolutionEnqueuer,
             noSuchMethodRegistry,
             compiler.options.strongMode && useStrongModeWorldStrategy
@@ -842,18 +844,19 @@
   /// Process backend specific annotations.
   // TODO(johnniwinther): Merge this with [AnnotationProcessor] and use
   // [ElementEnvironment.getMemberMetadata] in [AnnotationProcessor].
-  void processAnnotations(JClosedWorld closedWorld) {
+  void processAnnotations(
+      JClosedWorld closedWorld, InferredDataBuilder inferredDataBuilder) {
     // These methods are overwritten with generated versions.
     inlineCache.markAsNonInlinable(
         closedWorld.commonElements.getInterceptorMethod,
         insideLoop: true);
     for (MemberEntity entity in closedWorld.processedMembers) {
-      _processMemberAnnotations(closedWorld, entity);
+      _processMemberAnnotations(closedWorld, inferredDataBuilder, entity);
     }
   }
 
-  void _processMemberAnnotations(
-      JClosedWorld closedWorld, MemberEntity element) {
+  void _processMemberAnnotations(JClosedWorld closedWorld,
+      InferredDataBuilder inferredDataBuilder, MemberEntity element) {
     ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
     CommonElements commonElements = closedWorld.commonElements;
     bool hasNoInline = false;
@@ -927,14 +930,14 @@
           reporter.reportHintMessage(
               method, MessageKind.GENERIC, {'text': "Cannot throw"});
         }
-        closedWorld.registerCannotThrow(method);
+        inferredDataBuilder.registerCannotThrow(method);
       } else if (cls == commonElements.noSideEffectsClass) {
         hasNoSideEffects = true;
         if (VERBOSE_OPTIMIZER_HINTS) {
           reporter.reportHintMessage(
               method, MessageKind.GENERIC, {'text': "Has no side effects"});
         }
-        closedWorld.registerSideEffectsFree(method);
+        inferredDataBuilder.registerSideEffectsFree(method);
       }
     }
     if (hasForceInline && hasNoInline) {
diff --git a/pkg/compiler/lib/src/js_backend/inferred_data.dart b/pkg/compiler/lib/src/js_backend/inferred_data.dart
new file mode 100644
index 0000000..3318b1c
--- /dev/null
+++ b/pkg/compiler/lib/src/js_backend/inferred_data.dart
@@ -0,0 +1,246 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:collection' show Queue;
+
+import '../common.dart';
+import '../elements/entities.dart';
+import '../types/abstract_value_domain.dart';
+import '../universe/selector.dart';
+import '../universe/side_effects.dart';
+import '../world.dart';
+
+abstract class InferredData {
+  /// Returns the side effects of executing [element].
+  SideEffects getSideEffectsOfElement(FunctionEntity element);
+
+  /// Returns the side effects of calling [selector] on the [receiver].
+  SideEffects getSideEffectsOfSelector(
+      Selector selector, AbstractValue receiver);
+
+  /// Returns `true` if [element] is guaranteed not to throw an exception.
+  bool getCannotThrow(FunctionEntity element);
+
+  /// Returns `true` if [element] is called in a loop.
+  // TODO(johnniwinther): Is this 'potentially called' or 'known to be called'?
+  // TODO(johnniwinther): Change [MemberEntity] to [FunctionEntity].
+  bool isCalledInLoop(MemberEntity element);
+
+  /// Returns `true` if [element] might be passed to `Function.apply`.
+  // TODO(johnniwinther): Is this 'passed invocation target` or
+  // `passed as argument`?
+  bool getMightBePassedToApply(FunctionEntity element);
+}
+
+abstract class InferredDataBuilder {
+  /// Registers the executing of [element] as without side effects.
+  void registerSideEffectsFree(FunctionEntity element);
+
+  /// Returns the [SideEffectBuilder] associated with [element].
+  SideEffectsBuilder getSideEffectsBuilder(FunctionEntity member);
+
+  /// Registers that [element] might be passed to `Function.apply`.
+  // TODO(johnniwinther): Is this 'passed invocation target` or
+  // `passed as argument`?
+  void registerMightBePassedToApply(FunctionEntity element);
+
+  /// Returns `true` if [element] might be passed to `Function.apply` given the
+  /// currently inferred information.
+  bool getCurrentlyKnownMightBePassedToApply(FunctionEntity element);
+
+  /// Registers that [element] is called in a loop.
+  // TODO(johnniwinther): Is this 'potentially called' or 'known to be called'?
+  void addFunctionCalledInLoop(MemberEntity element);
+
+  /// Registers that [element] is guaranteed not to throw an exception.
+  void registerCannotThrow(FunctionEntity element);
+
+  /// Create a [InferredData] object for the collected information.
+  InferredData close(JClosedWorld closedWorld);
+}
+
+class InferredDataImpl implements InferredData {
+  final JClosedWorld _closedWorld;
+  final Set<MemberEntity> _functionsCalledInLoop;
+  final Map<FunctionEntity, SideEffects> _sideEffects;
+
+  final Set<FunctionEntity> _sideEffectsFreeElements;
+
+  final Set<FunctionEntity> _elementsThatCannotThrow;
+
+  final Set<FunctionEntity> _functionsThatMightBePassedToApply;
+
+  InferredDataImpl(
+      this._closedWorld,
+      this._functionsCalledInLoop,
+      this._sideEffects,
+      this._sideEffectsFreeElements,
+      this._elementsThatCannotThrow,
+      this._functionsThatMightBePassedToApply);
+
+  @override
+  SideEffects getSideEffectsOfSelector(
+      Selector selector, AbstractValue receiver) {
+    // We're not tracking side effects of closures.
+    if (selector.isClosureCall ||
+        _closedWorld.includesClosureCall(selector, receiver)) {
+      return new SideEffects();
+    }
+    SideEffects sideEffects = new SideEffects.empty();
+    for (MemberEntity e in _closedWorld.locateMembers(selector, receiver)) {
+      if (e.isField) {
+        if (selector.isGetter) {
+          if (!_closedWorld.fieldNeverChanges(e)) {
+            sideEffects.setDependsOnInstancePropertyStore();
+          }
+        } else if (selector.isSetter) {
+          sideEffects.setChangesInstanceProperty();
+        } else {
+          assert(selector.isCall);
+          sideEffects.setAllSideEffects();
+          sideEffects.setDependsOnSomething();
+        }
+      } else {
+        sideEffects.add(getSideEffectsOfElement(e));
+      }
+    }
+    return sideEffects;
+  }
+
+  @override
+  SideEffects getSideEffectsOfElement(FunctionEntity element) {
+    assert(_sideEffects != null,
+        failedAt(element, "Side effects have not been computed yet."));
+    // TODO(johnniwinther): Check that [_makeSideEffects] is only called if
+    // type inference has been disabled (explicitly or because of compile time
+    // errors).
+    return _sideEffects.putIfAbsent(element, _makeSideEffects);
+  }
+
+  static SideEffects _makeSideEffects() => new SideEffects();
+
+  @override
+  bool isCalledInLoop(MemberEntity element) {
+    return _functionsCalledInLoop.contains(element);
+  }
+
+  @override
+  bool getCannotThrow(FunctionEntity element) {
+    return _elementsThatCannotThrow.contains(element);
+  }
+
+  @override
+  bool getMightBePassedToApply(FunctionEntity element) {
+    // We assume all functions reach Function.apply if no functions are
+    // registered so.  We get an empty set in two circumstances (1) a trivial
+    // program and (2) when compiling without type inference
+    // (i.e. --disable-type-inference). Returning `true` has consequences (extra
+    // metadata for Function.apply) only when Function.apply is also part of the
+    // program. It is an unusual trivial program that includes Function.apply
+    // but does not call it on a function.
+    //
+    // TODO(sra): We should reverse the sense of this set and register functions
+    // that we have proven do not reach Function.apply.
+    if (_functionsThatMightBePassedToApply.isEmpty) return true;
+    return _functionsThatMightBePassedToApply.contains(element);
+  }
+}
+
+class InferredDataBuilderImpl implements InferredDataBuilder {
+  final Set<MemberEntity> _functionsCalledInLoop = new Set<MemberEntity>();
+  Map<MemberEntity, SideEffectsBuilder> _sideEffectsBuilders =
+      <MemberEntity, SideEffectsBuilder>{};
+  final Set<FunctionEntity> prematureSideEffectAccesses =
+      new Set<FunctionEntity>();
+
+  final Set<FunctionEntity> _sideEffectsFreeElements =
+      new Set<FunctionEntity>();
+
+  final Set<FunctionEntity> _elementsThatCannotThrow =
+      new Set<FunctionEntity>();
+
+  final Set<FunctionEntity> _functionsThatMightBePassedToApply =
+      new Set<FunctionEntity>();
+
+  InferredDataBuilderImpl();
+
+  @override
+  SideEffectsBuilder getSideEffectsBuilder(MemberEntity member) {
+    return _sideEffectsBuilders.putIfAbsent(
+        member, () => new SideEffectsBuilder(member));
+  }
+
+  @override
+  void registerSideEffectsFree(FunctionEntity element) {
+    _sideEffectsFreeElements.add(element);
+    assert(!_sideEffectsBuilders.containsKey(element));
+    _sideEffectsBuilders[element] = new SideEffectsBuilder.free(element);
+  }
+
+  /// Compute [SideEffects] for all registered [SideEffectBuilder]s.
+  InferredData close(JClosedWorld closedWorld) {
+    assert(_sideEffectsBuilders != null,
+        "Inferred data has already been computed.");
+    Map<FunctionEntity, SideEffects> _sideEffects =
+        <FunctionEntity, SideEffects>{};
+    Iterable<SideEffectsBuilder> sideEffectsBuilders =
+        _sideEffectsBuilders.values;
+    emptyWorkList(sideEffectsBuilders);
+    for (SideEffectsBuilder sideEffectsBuilder in sideEffectsBuilders) {
+      _sideEffects[sideEffectsBuilder.member] = sideEffectsBuilder.sideEffects;
+    }
+    _sideEffectsBuilders = null;
+
+    return new InferredDataImpl(
+        closedWorld,
+        _functionsCalledInLoop,
+        _sideEffects,
+        _sideEffectsFreeElements,
+        _elementsThatCannotThrow,
+        _functionsThatMightBePassedToApply);
+  }
+
+  static void emptyWorkList(Iterable<SideEffectsBuilder> sideEffectsBuilders) {
+    // TODO(johnniwinther): Optimize this algorithm, possibly by using
+    // `pkg/front_end/lib/src/dependency_walker.dart`.
+    Queue<SideEffectsBuilder> queue = new Queue<SideEffectsBuilder>();
+    Set<SideEffectsBuilder> inQueue = new Set<SideEffectsBuilder>();
+
+    for (SideEffectsBuilder builder in sideEffectsBuilders) {
+      queue.addLast(builder);
+      inQueue.add(builder);
+    }
+    while (queue.isNotEmpty) {
+      SideEffectsBuilder sideEffectsBuilder = queue.removeFirst();
+      inQueue.remove(sideEffectsBuilder);
+      for (SideEffectsBuilder dependent in sideEffectsBuilder.depending) {
+        if (dependent.add(sideEffectsBuilder.sideEffects)) {
+          if (inQueue.add(dependent)) {
+            queue.addLast(dependent);
+          }
+        }
+      }
+    }
+  }
+
+  @override
+  void addFunctionCalledInLoop(MemberEntity element) {
+    _functionsCalledInLoop.add(element);
+  }
+
+  @override
+  void registerCannotThrow(FunctionEntity element) {
+    _elementsThatCannotThrow.add(element);
+  }
+
+  @override
+  void registerMightBePassedToApply(FunctionEntity element) {
+    _functionsThatMightBePassedToApply.add(element);
+  }
+
+  @override
+  bool getCurrentlyKnownMightBePassedToApply(FunctionEntity element) {
+    return _functionsThatMightBePassedToApply.contains(element);
+  }
+}
diff --git a/pkg/compiler/lib/src/js_backend/resolution_listener.dart b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
index 3f97095..f46723a 100644
--- a/pkg/compiler/lib/src/js_backend/resolution_listener.dart
+++ b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
@@ -17,6 +17,7 @@
 import '../universe/use.dart' show StaticUse, TypeUse;
 import '../universe/world_impact.dart'
     show WorldImpact, WorldImpactBuilder, WorldImpactBuilderImpl;
+import 'allocator_analysis.dart';
 import 'backend.dart';
 import 'backend_impact.dart';
 import 'backend_usage.dart';
@@ -43,6 +44,7 @@
   final CustomElementsResolutionAnalysis _customElementsAnalysis;
 
   final NativeResolutionEnqueuer _nativeEnqueuer;
+  final KAllocatorAnalysis _allocatorAnalysis;
 
   /// True when we enqueue the loadLibrary code.
   bool _isLoadLibraryFunctionResolved = false;
@@ -58,6 +60,7 @@
       this._noSuchMethodRegistry,
       this._customElementsAnalysis,
       this._nativeEnqueuer,
+      this._allocatorAnalysis,
       this._deferredLoadTask);
 
   void _registerBackendImpact(
@@ -403,6 +406,7 @@
 
   @override
   WorldImpact registerInstantiatedClass(ClassEntity cls) {
+    _allocatorAnalysis.registerInstantiatedClass(cls);
     return _processClass(cls);
   }
 
diff --git a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
index b8d5263..c72190e 100644
--- a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
+++ b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
@@ -198,6 +198,8 @@
           namer,
           this,
           closedWorld,
+          closedWorld.allocatorAnalysis,
+          compiler.globalInference.inferredData,
           backend.sourceInformationStrategy,
           compiler.backendStrategy.sorter,
           typeTestRegistry.rtiNeededClasses,
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart
index a888d94..1e24de4 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart
@@ -134,6 +134,9 @@
       bool needsFieldsForConstructor = !emitStatics && !classIsNative;
       if (needsFieldsForConstructor || needsAccessor) {
         List<jsAst.Literal> fieldNameParts = <jsAst.Literal>[];
+        if (field.nullInitializerInAllocator) {
+          fieldNameParts.add(js.stringPart('0'));
+        }
         if (!needsAccessor) {
           // Emit field for constructor generation.
           assert(!classIsNative);
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart
index b5492b7..acb5308 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart
@@ -206,15 +206,22 @@
       var accessors = [];
 
       var str = "function " + name + "(";
-      var body = "";
+      var comma = "", body = "";
 
       for (var i = 0; i < fields.length; i++) {
-        if(i != 0) str += ", ";
-
-        var field = generateAccessor(fields[i], accessors, name);
-        var parameter = "p_" + field;
-        str += parameter;
-        body += ("this." + field + " = " + parameter + ";\\n");
+        var fieldDescriptor = fields[i];
+        if (fieldDescriptor.charCodeAt(0) == 48) {
+          fieldDescriptor = fieldDescriptor.substring(1);
+          var field = generateAccessor(fieldDescriptor, accessors, name);
+          body += ("this." + field + " = null;\\n");
+        } else {
+          var field = generateAccessor(fieldDescriptor, accessors, name);
+          var parameter = "p_" + field;
+          str += comma;
+          comma = ", ";
+          str += parameter;
+          body += ("this." + field + " = " + parameter + ";\\n");
+        }
       }
       if (supportsDirectProtoAccess) {
         body += "this." + #deferredActionString + "();";
diff --git a/pkg/compiler/lib/src/js_emitter/model.dart b/pkg/compiler/lib/src/js_emitter/model.dart
index 3938cfb..b1436c5 100644
--- a/pkg/compiler/lib/src/js_emitter/model.dart
+++ b/pkg/compiler/lib/src/js_emitter/model.dart
@@ -384,9 +384,17 @@
 
   final bool needsCheckedSetter;
 
+  final bool nullInitializerInAllocator; // TODO(sra): Generalize.
+
   // TODO(floitsch): support renamed fields.
-  Field(this.element, this.name, this.accessorName, this.getterFlags,
-      this.setterFlags, this.needsCheckedSetter);
+  Field(
+      this.element,
+      this.name,
+      this.accessorName,
+      this.getterFlags,
+      this.setterFlags,
+      this.needsCheckedSetter,
+      this.nullInitializerInAllocator);
 
   bool get needsGetter => getterFlags != 0;
   bool get needsUncheckedSetter => setterFlags != 0;
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
index 22ca61f..09d4947 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
@@ -19,15 +19,17 @@
 import '../../elements/types.dart';
 import '../../io/source_information.dart';
 import '../../js/js.dart' as js;
+import '../../js_backend/allocator_analysis.dart' show JAllocatorAnalysis;
 import '../../js_backend/backend.dart' show SuperMemberData;
 import '../../js_backend/backend_usage.dart';
 import '../../js_backend/constant_handler_javascript.dart'
     show JavaScriptConstantCompiler;
 import '../../js_backend/custom_elements_analysis.dart';
-import '../../js_backend/namer.dart' show Namer, StringBackedName;
-import '../../js_backend/native_data.dart';
+import '../../js_backend/inferred_data.dart';
 import '../../js_backend/interceptor_data.dart';
 import '../../js_backend/js_interop_analysis.dart';
+import '../../js_backend/namer.dart' show Namer, StringBackedName;
+import '../../js_backend/native_data.dart';
 import '../../js_backend/runtime_types.dart'
     show RuntimeTypesChecks, RuntimeTypesNeed, RuntimeTypesEncoder;
 import '../../js_model/elements.dart' show JGeneratorBody, JSignatureMethod;
@@ -83,6 +85,8 @@
   final Namer _namer;
   final CodeEmitterTask _task;
   final JClosedWorld _closedWorld;
+  final JAllocatorAnalysis _allocatorAnalysis;
+  final InferredData _inferredData;
   final SourceInformationStrategy _sourceInformationStrategy;
 
   /// The [Sorter] used for ordering elements in the generated JavaScript.
@@ -128,6 +132,8 @@
       this._namer,
       this._task,
       this._closedWorld,
+      this._allocatorAnalysis,
+      this._inferredData,
       this._sourceInformationStrategy,
       this._sorter,
       Set<ClassEntity> rtiNeededClasses,
@@ -831,7 +837,7 @@
 
   bool _methodCanBeApplied(FunctionEntity method) {
     return _backendUsage.isFunctionApplyUsed &&
-        _closedWorld.getMightBePassedToApply(method);
+        _inferredData.getMightBePassedToApply(method);
   }
 
   /* Map | List */ _computeParameterDefaultValues(FunctionEntity method) {
@@ -1065,8 +1071,16 @@
           }
         }
       }
+
+      // TODO(sra): Generalize for constants other than null.
+      bool nullInitializerInAllocator = false;
+      if (_allocatorAnalysis.isInitializedInAllocator(field)) {
+        assert(_allocatorAnalysis.initializerValue(field).isNull);
+        nullInitializerInAllocator = true;
+      }
+
       fields.add(new Field(field, name, accessorName, getterFlags, setterFlags,
-          needsCheckedSetter));
+          needsCheckedSetter, nullInitializerInAllocator));
     }
 
     FieldVisitor visitor = new FieldVisitor(_options, _elementEnvironment,
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 72ea813..b0356e6 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
@@ -826,10 +826,15 @@
     }
 
     for (Field field in cls.fields) {
-      js.Parameter parameter = new js.Parameter('t${parameters.length}');
-      parameters.add(parameter);
-      statements.add(
-          js.js.statement('#.# = #', [thisRef, field.name, parameter.name]));
+      if (field.nullInitializerInAllocator) {
+        // TODO(sra): Chain initializations, e.g. `this.b = this.a = null;`.
+        statements.add(js.js.statement('#.# = null', [thisRef, field.name]));
+      } else {
+        js.Parameter parameter = new js.Parameter('t${parameters.length}');
+        parameters.add(parameter);
+        statements.add(
+            js.js.statement('#.# = #', [thisRef, field.name, parameter.name]));
+      }
     }
 
     if (cls.hasRtiField) {
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index fac95b8..d8a72c6 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -24,9 +24,11 @@
 import '../inferrer/kernel_inferrer_engine.dart';
 import '../js_emitter/sorter.dart';
 import '../js/js_source_mapping.dart';
+import '../js_backend/allocator_analysis.dart';
 import '../js_backend/backend.dart';
 import '../js_backend/backend_usage.dart';
 import '../js_backend/constant_system_javascript.dart';
+import '../js_backend/inferred_data.dart';
 import '../js_backend/interceptor_data.dart';
 import '../js_backend/native_data.dart';
 import '../js_backend/no_such_method_registry.dart';
@@ -178,7 +180,7 @@
   @override
   SourceInformationStrategy get sourceInformationStrategy {
     if (!_compiler.options.generateSourceMap) {
-      return const JavaScriptSourceInformationStrategy();
+      return const JavaScriptSourceInformationStrategy<ir.Node>();
     }
     return new KernelSourceInformationStrategy(this);
   }
@@ -215,10 +217,11 @@
   }
 
   @override
-  TypesInferrer createTypesInferrer(JClosedWorld closedWorld,
+  TypesInferrer createTypesInferrer(
+      JClosedWorld closedWorld, InferredDataBuilder inferredDataBuilder,
       {bool disableTypeInference: false}) {
     return new KernelTypeGraphInferrer(_compiler, _elementMap, _globalLocalsMap,
-        _closureDataLookup, closedWorld,
+        _closureDataLookup, closedWorld, inferredDataBuilder,
         disableTypeInference: disableTypeInference);
   }
 }
@@ -374,6 +377,9 @@
         map.toBackendFunctionSet(oldNoSuchMethodData.otherImpls),
         map.toBackendFunctionSet(oldNoSuchMethodData.forwardingSyntaxImpls));
 
+    JAllocatorAnalysis allocatorAnalysis =
+        JAllocatorAnalysis.from(closedWorld.allocatorAnalysis, map, _options);
+
     return new JsClosedWorld(_elementMap,
         elementEnvironment: _elementEnvironment,
         dartTypes: _elementMap.types,
@@ -396,7 +402,8 @@
         processedMembers: processedMembers,
         mixinUses: mixinUses,
         typesImplementedBySubclasses: typesImplementedBySubclasses,
-        abstractValueStrategy: _abstractValueStrategy);
+        abstractValueStrategy: _abstractValueStrategy,
+        allocatorAnalysis: allocatorAnalysis);
   }
 
   BackendUsage _convertBackendUsage(
@@ -607,6 +614,7 @@
   final JsKernelToElementMap elementMap;
   final RuntimeTypesNeed rtiNeed;
   AbstractValueDomain _abstractValueDomain;
+  final JAllocatorAnalysis allocatorAnalysis;
 
   JsClosedWorld(this.elementMap,
       {ElementEnvironment elementEnvironment,
@@ -617,6 +625,7 @@
       InterceptorData interceptorData,
       BackendUsage backendUsage,
       this.rtiNeed,
+      this.allocatorAnalysis,
       NoSuchMethodData noSuchMethodData,
       Set<ClassEntity> implementedClasses,
       Iterable<ClassEntity> liveNativeClasses,
diff --git a/pkg/compiler/lib/src/kernel/element_map.dart b/pkg/compiler/lib/src/kernel/element_map.dart
index a293039..dc54118 100644
--- a/pkg/compiler/lib/src/kernel/element_map.dart
+++ b/pkg/compiler/lib/src/kernel/element_map.dart
@@ -120,6 +120,9 @@
 
   /// Return the [ImportEntity] corresponding to [node].
   ImportEntity getImport(ir.LibraryDependency node);
+
+  /// Returns the definition information for [cls].
+  ClassDefinition getClassDefinition(covariant ClassEntity cls);
 }
 
 /// Interface that translates between Kernel IR nodes and entities used for
@@ -185,9 +188,6 @@
   /// Returns the definition information for [member].
   MemberDefinition getMemberDefinition(covariant MemberEntity member);
 
-  /// Returns the definition information for [cls].
-  ClassDefinition getClassDefinition(covariant ClassEntity cls);
-
   /// Returns the static type of [node].
   // TODO(johnniwinther): This should be provided directly from kernel.
   DartType getStaticType(ir.Expression node);
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index f6812f4..e566ff0 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -27,6 +27,7 @@
 import '../elements/types.dart';
 import '../environment.dart';
 import '../frontend_strategy.dart';
+import '../js_backend/allocator_analysis.dart' show KAllocatorAnalysis;
 import '../js_backend/backend_usage.dart';
 import '../js_backend/constant_system_javascript.dart';
 import '../js_backend/interceptor_data.dart';
@@ -1961,6 +1962,7 @@
       InterceptorDataBuilder interceptorDataBuilder,
       BackendUsageBuilder backendUsageBuilder,
       RuntimeTypesNeedBuilder rtiNeedBuilder,
+      KAllocatorAnalysis allocatorAnalysis,
       NativeResolutionEnqueuer nativeResolutionEnqueuer,
       NoSuchMethodRegistry noSuchMethodRegistry,
       SelectorConstraintsStrategy selectorConstraintsStrategy,
@@ -1976,6 +1978,7 @@
             interceptorDataBuilder,
             backendUsageBuilder,
             rtiNeedBuilder,
+            allocatorAnalysis,
             nativeResolutionEnqueuer,
             noSuchMethodRegistry,
             selectorConstraintsStrategy,
@@ -2090,6 +2093,7 @@
 
   /// Members that are written either directly or through a setter selector.
   final Iterable<MemberEntity> assignedInstanceMembers;
+  final KAllocatorAnalysis allocatorAnalysis;
 
   final Iterable<ClassEntity> liveNativeClasses;
 
@@ -2106,6 +2110,7 @@
       this.noSuchMethodData,
       ResolutionWorldBuilder resolutionWorldBuilder,
       RuntimeTypesNeedBuilder rtiNeedBuilder,
+      this.allocatorAnalysis,
       Set<ClassEntity> implementedClasses,
       this.liveNativeClasses,
       this.liveInstanceMembers,
diff --git a/pkg/compiler/lib/src/kernel/element_map_mixins.dart b/pkg/compiler/lib/src/kernel/element_map_mixins.dart
index c661c48..d8c74cc 100644
--- a/pkg/compiler/lib/src/kernel/element_map_mixins.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_mixins.dart
@@ -604,7 +604,8 @@
 
   @override
   ConstantExpression visitIntLiteral(ir.IntLiteral node) {
-    return new IntConstantExpression(new BigInt.from(node.value));
+    return new IntConstantExpression(
+        new BigInt.from(node.value).toUnsigned(64));
   }
 
   @override
diff --git a/pkg/compiler/lib/src/kernel/kernel_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
index d6d273e..b595d81 100644
--- a/pkg/compiler/lib/src/kernel/kernel_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
@@ -20,6 +20,7 @@
 import '../enqueue.dart';
 import '../environment.dart' as env;
 import '../frontend_strategy.dart';
+import '../js_backend/allocator_analysis.dart' show KAllocatorAnalysis;
 import '../js_backend/backend_usage.dart';
 import '../js_backend/interceptor_data.dart';
 import '../js_backend/native_data.dart';
@@ -129,6 +130,7 @@
       InterceptorDataBuilder interceptorDataBuilder,
       BackendUsageBuilder backendUsageBuilder,
       RuntimeTypesNeedBuilder rtiNeedBuilder,
+      KAllocatorAnalysis allocatorAnalysis,
       NativeResolutionEnqueuer nativeResolutionEnqueuer,
       NoSuchMethodRegistry noSuchMethodRegistry,
       SelectorConstraintsStrategy selectorConstraintsStrategy,
@@ -142,6 +144,7 @@
         interceptorDataBuilder,
         backendUsageBuilder,
         rtiNeedBuilder,
+        allocatorAnalysis,
         nativeResolutionEnqueuer,
         noSuchMethodRegistry,
         selectorConstraintsStrategy,
diff --git a/pkg/compiler/lib/src/native/behavior.dart b/pkg/compiler/lib/src/native/behavior.dart
index dc624c1..5de83bd 100644
--- a/pkg/compiler/lib/src/native/behavior.dart
+++ b/pkg/compiler/lib/src/native/behavior.dart
@@ -687,15 +687,15 @@
 
   /// Models the behavior of having instances of [type] escape from Dart code
   /// into native code.
-  void _escape(DartType type) {
+  void _escape(DartType type, bool isJsInterop) {
     type = elementEnvironment.getUnaliasedType(type);
     if (type is FunctionType) {
       FunctionType functionType = type;
       // A function might be called from native code, passing us novel
       // parameters.
-      _escape(functionType.returnType);
+      _escape(functionType.returnType, isJsInterop);
       for (DartType parameter in functionType.parameterTypes) {
-        _capture(parameter);
+        _capture(parameter, isJsInterop);
       }
     }
   }
@@ -706,16 +706,16 @@
   ///
   /// We assume that JS-interop APIs cannot instantiate Dart types or
   /// non-JSInterop native types.
-  void _capture(DartType type, {bool isInterop: false}) {
+  void _capture(DartType type, bool isJsInterop) {
     type = elementEnvironment.getUnaliasedType(type);
     if (type is FunctionType) {
       FunctionType functionType = type;
-      _capture(functionType.returnType, isInterop: isInterop);
+      _capture(functionType.returnType, isJsInterop);
       for (DartType parameter in functionType.parameterTypes) {
-        _escape(parameter);
+        _escape(parameter, isJsInterop);
       }
     } else {
-      if (!isInterop) {
+      if (!isJsInterop) {
         _behavior.typesInstantiated.add(type);
       } else {
         if (type is InterfaceType &&
@@ -756,14 +756,14 @@
         : commonElements.dynamicType);
     // Declared types are nullable.
     _behavior.typesReturned.add(commonElements.nullType);
-    _capture(type, isInterop: isJsInterop);
+    _capture(type, isJsInterop);
     _overrideWithAnnotations(metadata, lookupType);
     return _behavior;
   }
 
   NativeBehavior buildFieldStoreBehavior(DartType type) {
     _behavior = new NativeBehavior();
-    _escape(type);
+    _escape(type, false);
     // We don't override the default behaviour - the annotations apply to
     // loading the field.
     return _behavior;
@@ -790,13 +790,13 @@
       // Declared types are nullable.
       _behavior.typesReturned.add(commonElements.nullType);
     }
-    _capture(type, isInterop: isJsInterop);
+    _capture(type, isJsInterop);
 
     for (DartType type in type.optionalParameterTypes) {
-      _escape(type);
+      _escape(type, isJsInterop);
     }
     for (DartType type in type.namedParameterTypes) {
-      _escape(type);
+      _escape(type, isJsInterop);
     }
 
     _overrideWithAnnotations(metadata, lookupType);
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index aed9b6c..079f4c0 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -22,6 +22,7 @@
 import '../elements/types.dart';
 import '../io/source_information.dart';
 import '../js/js.dart' as js;
+import '../js_backend/allocator_analysis.dart' show JAllocatorAnalysis;
 import '../js_backend/backend.dart' show JavaScriptBackend;
 import '../js_backend/runtime_types.dart' show RuntimeTypesSubstitutions;
 import '../js_emitter/js_emitter.dart' show NativeEmitter;
@@ -36,6 +37,7 @@
 import '../universe/call_structure.dart';
 import '../universe/selector.dart';
 import '../universe/side_effects.dart' show SideEffects;
+import '../universe/target_checks.dart' show TargetChecks;
 import '../universe/use.dart'
     show ConstantUse, ConstrainedDynamicUse, StaticUse;
 import '../universe/world_builder.dart' show CodegenWorldBuilder;
@@ -73,6 +75,7 @@
   final CodegenWorldBuilder _worldBuilder;
   final CodegenRegistry registry;
   final ClosureDataLookup closureDataLookup;
+  JAllocatorAnalysis _allocatorAnalysis;
 
   /// A stack of [InterfaceType]s that have been seen during inlining of
   /// factory constructors.  These types are preserved in [HInvokeStatic]s and
@@ -131,7 +134,8 @@
       this.nativeEmitter,
       this._sourceInformationStrategy)
       : this.targetElement = _effectiveTargetElementFor(initialTargetElement),
-        _infoReporter = compiler.dumpInfoTask {
+        _infoReporter = compiler.dumpInfoTask,
+        _allocatorAnalysis = closedWorld.allocatorAnalysis {
     _enterFrame(targetElement);
     this.loopHandler = new KernelLoopHandler(this);
     typeBuilder = new KernelTypeBuilder(this, _elementMap, _globalLocalsMap);
@@ -320,7 +324,7 @@
   void buildField(ir.Field node) {
     _inLazyInitializerExpression = node.isStatic;
     FieldEntity field = _elementMap.getMember(node);
-    openFunction(field);
+    openFunction(field, checks: TargetChecks.none);
     if (node.isInstanceMember && options.enableTypeAssertions) {
       HInstruction thisInstruction = localsHandler.readThis(
           sourceInformation: _sourceInformationBuilder.buildGet(node));
@@ -468,7 +472,8 @@
     ClassEntity cls = constructor.enclosingClass;
 
     if (_inliningStack.isEmpty) {
-      openFunction(constructor, node.function);
+      openFunction(constructor,
+          functionNode: node.function, checks: TargetChecks.none);
     }
 
     // [fieldValues] accumulates the field initializer values, which may be
@@ -487,7 +492,10 @@
         (ClassEntity enclosingClass, FieldEntity member) {
       HInstruction value = constructorData.fieldValues[member];
       if (value == null) {
-        assert(isCustomElement || reporter.hasReportedError,
+        assert(
+            _allocatorAnalysis.isInitializedInAllocator(member) ||
+                isCustomElement ||
+                reporter.hasReportedError,
             'No initializer value for field ${member}');
       } else {
         fields.add(member);
@@ -697,12 +705,15 @@
         default:
           failedAt(field, "Unexpected member definition $definition.");
       }
+
       if (node.initializer == null) {
         // Unassigned fields of native classes are not initialized to
         // prevent overwriting pre-initialized native properties.
         if (!nativeData.isNativeOrExtendsNative(cls)) {
-          constructorData.fieldValues[field] =
-              graph.addConstantNull(closedWorld);
+          if (!_allocatorAnalysis.isInitializedInAllocator(field)) {
+            constructorData.fieldValues[field] =
+                graph.addConstantNull(closedWorld);
+          }
         }
       } else if (node.initializer is! ir.NullLiteral ||
           !nativeData.isNativeClass(cls)) {
@@ -710,10 +721,12 @@
         // class type parameters are accessed as values.
         // TODO(sra): It would be sufficient to know the context was a field
         // initializer.
-        inlinedFrom(field, () {
-          node.initializer.accept(this);
-          constructorData.fieldValues[field] = pop();
-        });
+        if (!_allocatorAnalysis.isInitializedInAllocator(field)) {
+          inlinedFrom(field, () {
+            node.initializer.accept(this);
+            constructorData.fieldValues[field] = pop();
+          });
+        }
       }
     });
   }
@@ -741,6 +754,7 @@
     var foundSuperOrRedirectCall = false;
     for (var initializer in constructor.initializers) {
       if (initializer is ir.FieldInitializer) {
+        // TODO(sra): Skip fields initialized in allocator.
         initializer.value.accept(this);
         constructorData.fieldValues[_elementMap.getField(initializer.field)] =
             pop();
@@ -949,8 +963,8 @@
 
   /// Builds generative constructor body.
   void buildConstructorBody(ir.Constructor constructor) {
-    openFunction(
-        _elementMap.getConstructorBody(constructor), constructor.function);
+    openFunction(_elementMap.getConstructorBody(constructor),
+        functionNode: constructor.function, checks: TargetChecks.none);
     constructor.function.body.accept(this);
     closeFunction();
   }
@@ -964,7 +978,11 @@
       return;
     }
 
-    openFunction(function, functionNode);
+    // TODO(sra): Static methods with no tear-off can be generated with no
+    // checks.
+    // TODO(sra): Instance methods can be generated with reduced checks if
+    // called only from non-dynamic call-sites.
+    openFunction(function, functionNode: functionNode);
 
     // If [functionNode] is `operator==` we explicitly add a null check at the
     // beginning of the method. This is to avoid having call sites do the null
@@ -1021,7 +1039,7 @@
   /// per-invocation checks and the body, which is later transformed, contains
   /// the re-entrant 'state machine' code.
   void buildGenerator(FunctionEntity function, ir.FunctionNode functionNode) {
-    openFunction(function, functionNode);
+    openFunction(function, functionNode: functionNode);
 
     // Prepare to tail-call the body.
 
@@ -1085,7 +1103,7 @@
   void buildGeneratorBody(
       JGeneratorBody function, ir.FunctionNode functionNode) {
     FunctionEntity entry = function.function;
-    openFunction(entry, functionNode);
+    openFunction(entry, functionNode: functionNode, checks: TargetChecks.none);
     graph.needsAsyncRewrite = true;
     if (!function.elementType.containsFreeTypeVariables) {
       // We can generate the element type in place
@@ -1106,13 +1124,16 @@
     return true;
   }
 
-  void _potentiallyAddFunctionParameterTypeChecks(ir.FunctionNode function) {
+  void _potentiallyAddFunctionParameterTypeChecks(
+      ir.FunctionNode function, TargetChecks targetChecks) {
     // Put the type checks in the first successor of the entry,
     // because that is where the type guards will also be inserted.
     // This way we ensure that a type guard will dominate the type
     // check.
 
-    checkTypeVariableBounds(targetElement);
+    if (targetChecks.checkTypeParameters) {
+      checkTypeVariableBounds(targetElement);
+    }
 
     MemberDefinition definition =
         _elementMap.getMemberDefinition(targetElement);
@@ -1128,9 +1149,22 @@
         return;
       }
       HInstruction newParameter = localsHandler.directLocals[local];
+      DartType type = _getDartTypeIfValid(variable.type);
 
-      newParameter = typeBuilder.potentiallyCheckOrTrustTypeOfParameter(
-          newParameter, _getDartTypeIfValid(variable.type));
+      if (options.strongMode) {
+        if (targetChecks.checkAllParameters ||
+            (targetChecks.checkCovariantParameters &&
+                (variable.isGenericCovariantImpl || variable.isCovariant))) {
+          newParameter = typeBuilder.potentiallyCheckOrTrustTypeOfParameter(
+              newParameter, type);
+        } else {
+          newParameter = typeBuilder.trustTypeOfParameter(newParameter, type);
+        }
+      } else {
+        newParameter = typeBuilder.potentiallyCheckOrTrustTypeOfParameter(
+            newParameter, type);
+      }
+
       localsHandler.directLocals[local] = newParameter;
     }
 
@@ -1167,7 +1201,7 @@
     // TODO(johnniwinther): Non-js-interop external functions should
     // throw a runtime error.
     assert(functionNode.body == null);
-    openFunction(function, functionNode);
+    openFunction(function, functionNode: functionNode);
 
     if (closedWorld.nativeData.isNativeMember(targetElement)) {
       nativeEmitter.nativeMethods.add(targetElement);
@@ -1247,7 +1281,11 @@
     }
   }
 
-  void openFunction(MemberEntity member, [ir.FunctionNode functionNode]) {
+  void openFunction(MemberEntity member,
+      {ir.FunctionNode functionNode, TargetChecks checks}) {
+    // TODO(sra): Pass from all sites.
+    checks ??= TargetChecks.dynamicChecks;
+
     Map<Local, AbstractValue> parameterMap = <Local, AbstractValue>{};
     if (functionNode != null) {
       void handleParameter(ir.VariableDeclaration node) {
@@ -1281,7 +1319,7 @@
     _addFunctionTypeVariablesIfNeeded(member);
 
     if (functionNode != null) {
-      _potentiallyAddFunctionParameterTypeChecks(functionNode);
+      _potentiallyAddFunctionParameterTypeChecks(functionNode, checks);
     }
     _insertTraceCall(member);
     _insertCoverageCall(member);
@@ -2622,7 +2660,7 @@
 
   @override
   void visitIntLiteral(ir.IntLiteral node) {
-    stack.add(graph.addConstantInt(node.value, closedWorld));
+    stack.add(graph.addConstantIntAsUnsigned(node.value, closedWorld));
   }
 
   @override
@@ -3961,14 +3999,14 @@
     } else {
       instruction = new HInvokeStatic(
           target, arguments, typeMask, typeArguments,
-          targetCanThrow: !closedWorld.getCannotThrow(target))
+          targetCanThrow: !inferredData.getCannotThrow(target))
         ..sourceInformation = sourceInformation;
 
       if (currentImplicitInstantiations.isNotEmpty) {
         instruction.instantiatedTypes =
             new List<InterfaceType>.from(currentImplicitInstantiations);
       }
-      instruction.sideEffects = closedWorld.getSideEffectsOfElement(target);
+      instruction.sideEffects = inferredData.getSideEffectsOfElement(target);
     }
     push(instruction);
   }
@@ -4361,7 +4399,7 @@
         sourceInformation,
         isSetter: selector.isSetter || selector.isIndexSet);
     instruction.sideEffects =
-        closedWorld.getSideEffectsOfSelector(selector, null);
+        inferredData.getSideEffectsOfSelector(selector, null);
     push(instruction);
     return instruction;
   }
diff --git a/pkg/compiler/lib/src/ssa/graph_builder.dart b/pkg/compiler/lib/src/ssa/graph_builder.dart
index e67eeb4..78d0ccd 100644
--- a/pkg/compiler/lib/src/ssa/graph_builder.dart
+++ b/pkg/compiler/lib/src/ssa/graph_builder.dart
@@ -16,10 +16,11 @@
 import '../js_backend/backend.dart';
 import '../js_backend/backend_usage.dart';
 import '../js_backend/constant_handler_javascript.dart';
+import '../js_backend/interceptor_data.dart';
+import '../js_backend/inferred_data.dart';
+import '../js_backend/js_interop_analysis.dart';
 import '../js_backend/namer.dart';
 import '../js_backend/native_data.dart';
-import '../js_backend/js_interop_analysis.dart';
-import '../js_backend/interceptor_data.dart';
 import '../js_backend/runtime_types.dart';
 import '../js_emitter/code_emitter_task.dart';
 import '../options.dart';
@@ -92,6 +93,8 @@
 
   JsInteropAnalysis get jsInteropAnalysis => backend.jsInteropAnalysis;
 
+  InferredData get inferredData => compiler.globalInference.inferredData;
+
   DeferredLoadTask get deferredLoadTask => compiler.deferredLoadTask;
 
   DartTypes get types => closedWorld.dartTypes;
diff --git a/pkg/compiler/lib/src/ssa/kernel_impact.dart b/pkg/compiler/lib/src/ssa/kernel_impact.dart
index 950aa78..2352143 100644
--- a/pkg/compiler/lib/src/ssa/kernel_impact.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_impact.dart
@@ -235,8 +235,23 @@
 
   @override
   void visitIntLiteral(ir.IntLiteral literal) {
-    impactBuilder.registerConstantLiteral(
-        new IntConstantExpression(new BigInt.from(literal.value)));
+    // Check that this value can be precisely represented as a double, and throw
+    // an error if not:
+    if (new BigInt.from(literal.value) !=
+        new BigInt.from(literal.value.toDouble())) {
+      // TODO(efortuna): Switch to error message.
+      reporter.reportWarningMessage(
+          CURRENT_ELEMENT_SPANNABLE, MessageKind.GENERIC, {
+        'text': 'The integer literal '
+            '${new BigInt.from(literal.value)} cannot be represented'
+            ' exactly in JavaScript and will be rounded to '
+            '${new BigInt.from(literal.value.toDouble())}. Use the rounded '
+            'value to avoid this warning.'
+      });
+    }
+
+    impactBuilder.registerConstantLiteral(new IntConstantExpression(
+        new BigInt.from(literal.value).toUnsigned(64)));
   }
 
   @override
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index 59ac3b2..2258231 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -301,6 +301,12 @@
         closedWorld.constantSystem.createIntFromInt(i), closedWorld);
   }
 
+  HConstant addConstantIntAsUnsigned(int i, JClosedWorld closedWorld) {
+    return addConstant(
+        closedWorld.constantSystem.createInt(new BigInt.from(i).toUnsigned(64)),
+        closedWorld);
+  }
+
   HConstant addConstantDouble(double d, JClosedWorld closedWorld) {
     return addConstant(closedWorld.constantSystem.createDouble(d), closedWorld);
   }
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index f8313e8..bc0ea62 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -12,6 +12,7 @@
 import '../elements/entities.dart';
 import '../elements/types.dart';
 import '../js/js.dart' as js;
+import '../js_backend/allocator_analysis.dart' show JAllocatorAnalysis;
 import '../js_backend/backend.dart';
 import '../js_backend/native_data.dart' show NativeData;
 import '../js_backend/runtime_types.dart';
@@ -2586,17 +2587,21 @@
 class SsaLoadElimination extends HBaseVisitor implements OptimizationPhase {
   final Compiler compiler;
   final JClosedWorld closedWorld;
+  final JAllocatorAnalysis _allocatorAnalysis;
   final String name = "SsaLoadElimination";
   MemorySet memorySet;
   List<MemorySet> memories;
   bool newGvnCandidates = false;
+  HGraph _graph;
 
-  SsaLoadElimination(this.compiler, this.closedWorld);
+  SsaLoadElimination(this.compiler, this.closedWorld)
+      : _allocatorAnalysis = closedWorld.allocatorAnalysis;
 
   AbstractValueDomain get _abstractValueDomain =>
       closedWorld.abstractValueDomain;
 
   void visitGraph(HGraph graph) {
+    _graph = graph;
     memories = new List<MemorySet>(graph.blocks.length);
     List<HBasicBlock> blocks = graph.blocks;
     for (int i = 0; i < blocks.length; i++) {
@@ -2705,8 +2710,15 @@
         if (compiler.elementHasCompileTimeError(
             // ignore: UNNECESSARY_CAST
             member as Entity)) return;
-        memorySet.registerFieldValue(
-            member, instruction, instruction.inputs[argumentIndex++]);
+        if (_allocatorAnalysis.isInitializedInAllocator(member)) {
+          // TODO(sra): Can we avoid calling HGraph.addConstant?
+          ConstantValue value = _allocatorAnalysis.initializerValue(member);
+          HConstant constant = _graph.addConstant(value, closedWorld);
+          memorySet.registerFieldValue(member, instruction, constant);
+        } else {
+          memorySet.registerFieldValue(
+              member, instruction, instruction.inputs[argumentIndex++]);
+        }
       });
     }
     // In case this instruction has as input non-escaping objects, we
diff --git a/pkg/compiler/lib/src/types/types.dart b/pkg/compiler/lib/src/types/types.dart
index a182ee7..b078b9a 100644
--- a/pkg/compiler/lib/src/types/types.dart
+++ b/pkg/compiler/lib/src/types/types.dart
@@ -8,6 +8,7 @@
 import '../common/tasks.dart' show CompilerTask;
 import '../compiler.dart' show Compiler;
 import '../elements/entities.dart';
+import '../js_backend/inferred_data.dart';
 import '../inferrer/type_graph_inferrer.dart' show TypeGraphInferrer;
 import '../universe/selector.dart' show Selector;
 import '../world.dart' show JClosedWorld;
@@ -253,21 +254,24 @@
 
   GlobalTypeInferenceResults results;
 
+  InferredData inferredData;
+
   GlobalTypeInferenceTask(Compiler compiler)
       : compiler = compiler,
         super(compiler.measurer);
 
   /// Runs the global type-inference algorithm once.
-  void runGlobalTypeInference(
-      FunctionEntity mainElement, JClosedWorld closedWorld) {
+  void runGlobalTypeInference(FunctionEntity mainElement,
+      JClosedWorld closedWorld, InferredDataBuilder inferredDataBuilder) {
     measure(() {
       typesInferrerInternal ??= compiler.backendStrategy.createTypesInferrer(
-          closedWorld,
+          closedWorld, inferredDataBuilder,
           disableTypeInference: compiler.disableTypeInference);
       typesInferrerInternal.analyzeMain(mainElement);
       typesInferrerInternal.clear();
       results = typesInferrerInternal.createResults();
       closedWorld.noSuchMethodData.categorizeComplexImplementations(results);
+      inferredData = inferredDataBuilder.close(closedWorld);
     });
   }
 }
diff --git a/pkg/compiler/lib/src/universe/resolution_world_builder.dart b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
index f90d4a6..726dc05 100644
--- a/pkg/compiler/lib/src/universe/resolution_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
@@ -369,6 +369,7 @@
   final InterceptorDataBuilder _interceptorDataBuilder;
   final BackendUsageBuilder _backendUsageBuilder;
   final RuntimeTypesNeedBuilder _rtiNeedBuilder;
+  final KAllocatorAnalysis _allocatorAnalysis;
   final NativeResolutionEnqueuer _nativeResolutionEnqueuer;
   final NoSuchMethodRegistry _noSuchMethodRegistry;
 
@@ -401,6 +402,7 @@
       this._interceptorDataBuilder,
       this._backendUsageBuilder,
       this._rtiNeedBuilder,
+      this._allocatorAnalysis,
       this._nativeResolutionEnqueuer,
       this._noSuchMethodRegistry,
       this.selectorConstraintsStrategy,
@@ -994,6 +996,7 @@
       InterceptorDataBuilder interceptorDataBuilder,
       BackendUsageBuilder backendUsageBuilder,
       RuntimeTypesNeedBuilder rtiNeedBuilder,
+      KAllocatorAnalysis allocatorAnalysis,
       NativeResolutionEnqueuer nativeResolutionEnqueuer,
       NoSuchMethodRegistry noSuchMethodRegistry,
       SelectorConstraintsStrategy selectorConstraintsStrategy,
@@ -1009,6 +1012,7 @@
             interceptorDataBuilder,
             backendUsageBuilder,
             rtiNeedBuilder,
+            allocatorAnalysis,
             nativeResolutionEnqueuer,
             noSuchMethodRegistry,
             selectorConstraintsStrategy,
@@ -1043,6 +1047,7 @@
         noSuchMethodData: _noSuchMethodRegistry.close(),
         resolutionWorldBuilder: this,
         rtiNeedBuilder: _rtiNeedBuilder,
+        allocatorAnalysis: _allocatorAnalysis,
         implementedClasses: _implementedClasses,
         liveNativeClasses: _nativeResolutionEnqueuer.liveNativeClasses,
         liveInstanceMembers: _liveInstanceMembers,
diff --git a/pkg/compiler/lib/src/universe/target_checks.dart b/pkg/compiler/lib/src/universe/target_checks.dart
new file mode 100644
index 0000000..6d4ac79
--- /dev/null
+++ b/pkg/compiler/lib/src/universe/target_checks.dart
@@ -0,0 +1,52 @@
+// 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.
+
+library dart2js.target_checks;
+
+/// A summary of the checks required when entering a target method.
+///
+/// The target checks are used to annotate call sites with the checking required
+/// from that call site.
+///
+/// The target can either perform worst-case checks over all call sites, or can
+/// be generated as multiple entry points for different TargetChecks.
+///
+/// The TargetChecks at a call site can be refined by analysis.  For example,
+/// the generic covariant check for writing into a List might not be required
+/// when copying values from a List allocated with the same type variable value.
+///
+/// The TargetChecks at a call site can be used to inform optimizations, for
+/// example, only lowering to simpler instructions when generic covariant check
+/// is required.
+///
+/// Unsound modes can be implemented in a scoped manner by using a TargetChecks
+/// that has fewer checks than required (or no checks) in the unsound region.
+class TargetChecks {
+  // Typical of direct static call sites.
+  // Typical of static method targets with no tear-offs.
+  static final TargetChecks none = const TargetChecks._(false, false, false);
+
+  // Typical of closure calls and dynamic calls.
+  static final TargetChecks dynamicChecks =
+      const TargetChecks._(true, true, true);
+
+  // Typical of method calls.
+  static final TargetChecks covariantChecks =
+      const TargetChecks._(false, true, false);
+
+  // TODO(sra): This can be more fine-grained, talking about individual
+  // parameters.
+  final bool _checkOtherParameters;
+  final bool _checkCovariantParameters;
+  final bool _checkTypeParameters;
+  const TargetChecks._(
+    this._checkOtherParameters,
+    this._checkCovariantParameters,
+    this._checkTypeParameters,
+  );
+
+  bool get checkTypeParameters => _checkTypeParameters;
+  bool get checkCovariantParameters => _checkCovariantParameters;
+  bool get checkAllParameters => _checkOtherParameters;
+}
diff --git a/pkg/compiler/lib/src/universe/world_builder.dart b/pkg/compiler/lib/src/universe/world_builder.dart
index 088849b..d43fb15 100644
--- a/pkg/compiler/lib/src/universe/world_builder.dart
+++ b/pkg/compiler/lib/src/universe/world_builder.dart
@@ -12,6 +12,7 @@
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart';
+import '../js_backend/allocator_analysis.dart' show KAllocatorAnalysis;
 import '../js_backend/backend_usage.dart' show BackendUsageBuilder;
 import '../js_backend/interceptor_data.dart' show InterceptorDataBuilder;
 import '../js_backend/native_data.dart' show NativeBasicData, NativeDataBuilder;
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index 4dde4f2..3cc5ee8 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -4,8 +4,6 @@
 
 library dart2js.world;
 
-import 'dart:collection' show Queue;
-
 import 'package:front_end/src/fasta/util/link.dart' show Link;
 
 import 'common.dart';
@@ -14,6 +12,8 @@
 import 'constants/constant_system.dart';
 import 'elements/entities.dart';
 import 'elements/types.dart';
+import 'js_backend/allocator_analysis.dart'
+    show JAllocatorAnalysis, KAllocatorAnalysis;
 import 'js_backend/backend_usage.dart' show BackendUsage;
 import 'js_backend/interceptor_data.dart' show InterceptorData;
 import 'js_backend/native_data.dart' show NativeData;
@@ -26,7 +26,6 @@
 import 'universe/class_set.dart';
 import 'universe/function_set.dart' show FunctionSet;
 import 'universe/selector.dart' show Selector;
-import 'universe/side_effects.dart' show SideEffects, SideEffectsBuilder;
 import 'universe/world_builder.dart';
 
 /// Common superinterface for [OpenWorld] and [JClosedWorld].
@@ -42,6 +41,8 @@
 /// optimizations and other compiler decisions during code generation.
 // TODO(johnniwinther): Maybe this should just be called the JWorld.
 abstract class JClosedWorld implements World {
+  JAllocatorAnalysis get allocatorAnalysis;
+
   BackendUsage get backendUsage;
 
   NativeData get nativeData;
@@ -318,56 +319,11 @@
   /// `null` is returned.
   FieldEntity locateSingleField(Selector selector, AbstractValue receiver);
 
-  /// Returns the side effects of executing [element].
-  SideEffects getSideEffectsOfElement(FunctionEntity element);
-
-  /// Returns the side effects of calling [selector] on the [receiver].
-  SideEffects getSideEffectsOfSelector(
-      Selector selector, AbstractValue receiver);
-
-  /// Returns `true` if [element] is guaranteed not to throw an exception.
-  bool getCannotThrow(FunctionEntity element);
-
-  /// Returns `true` if [element] is called in a loop.
-  // TODO(johnniwinther): Is this 'potentially called' or 'known to be called'?
-  // TODO(johnniwinther): Change [MemberEntity] to [FunctionEntity].
-  bool isCalledInLoop(MemberEntity element);
-
-  /// Returns `true` if [element] might be passed to `Function.apply`.
-  // TODO(johnniwinther): Is this 'passed invocation target` or
-  // `passed as argument`?
-  bool getMightBePassedToApply(FunctionEntity element);
-
   /// Returns a string representation of the closed world.
   ///
   /// If [cls] is provided, the dump will contain only classes related to [cls].
   String dump([ClassEntity cls]);
 
-  /// Registers the executing of [element] as without side effects.
-  void registerSideEffectsFree(FunctionEntity element);
-
-  /// Returns the [SideEffectBuilder] associated with [element].
-  SideEffectsBuilder getSideEffectsBuilder(FunctionEntity member);
-
-  /// Compute [SideEffects] for all registered [SideEffectBuilder]s.
-  void computeSideEffects();
-
-  /// Registers that [element] might be passed to `Function.apply`.
-  // TODO(johnniwinther): Is this 'passed invocation target` or
-  // `passed as argument`?
-  void registerMightBePassedToApply(FunctionEntity element);
-
-  /// Returns `true` if [element] might be passed to `Function.apply` given the
-  /// currently inferred information.
-  bool getCurrentlyKnownMightBePassedToApply(FunctionEntity element);
-
-  /// Registers that [element] is called in a loop.
-  // TODO(johnniwinther): Is this 'potentially called' or 'known to be called'?
-  void addFunctionCalledInLoop(MemberEntity element);
-
-  /// Registers that [element] is guaranteed not to throw an exception.
-  void registerCannotThrow(FunctionEntity element);
-
   /// Adds the closure class [cls] to the inference world. The class is
   /// considered directly instantiated. If [fromInstanceMember] is true, this
   /// closure class represents a closure that is inside an instance member, thus
@@ -432,22 +388,6 @@
   final Map<ClassEntity, Map<ClassEntity, bool>> _subtypeCoveredByCache =
       <ClassEntity, Map<ClassEntity, bool>>{};
 
-  final Set<MemberEntity> _functionsCalledInLoop = new Set<MemberEntity>();
-  Map<FunctionEntity, SideEffects> _sideEffects;
-  Map<MemberEntity, SideEffectsBuilder> _sideEffectsBuilders =
-      <MemberEntity, SideEffectsBuilder>{};
-  final Set<FunctionEntity> prematureSideEffectAccesses =
-      new Set<FunctionEntity>();
-
-  final Set<FunctionEntity> _sideEffectsFreeElements =
-      new Set<FunctionEntity>();
-
-  final Set<FunctionEntity> _elementsThatCannotThrow =
-      new Set<FunctionEntity>();
-
-  final Set<FunctionEntity> _functionsThatMightBePassedToApply =
-      new Set<FunctionEntity>();
-
   final ElementEnvironment elementEnvironment;
   final DartTypes dartTypes;
   final CommonElements commonElements;
@@ -1053,139 +993,6 @@
     return false;
   }
 
-  SideEffects getSideEffectsOfSelector(
-      Selector selector, AbstractValue receiver) {
-    // We're not tracking side effects of closures.
-    if (selector.isClosureCall || includesClosureCall(selector, receiver)) {
-      return new SideEffects();
-    }
-    SideEffects sideEffects = new SideEffects.empty();
-    _ensureFunctionSet();
-    for (MemberEntity e
-        in _allFunctions.filter(selector, receiver, abstractValueDomain)) {
-      if (e.isField) {
-        if (selector.isGetter) {
-          if (!fieldNeverChanges(e)) {
-            sideEffects.setDependsOnInstancePropertyStore();
-          }
-        } else if (selector.isSetter) {
-          sideEffects.setChangesInstanceProperty();
-        } else {
-          assert(selector.isCall);
-          sideEffects.setAllSideEffects();
-          sideEffects.setDependsOnSomething();
-        }
-      } else {
-        sideEffects.add(getSideEffectsOfElement(e));
-      }
-    }
-    return sideEffects;
-  }
-
-  SideEffects getSideEffectsOfElement(FunctionEntity element) {
-    assert(checkEntity(element));
-    assert(_sideEffects != null,
-        failedAt(element, "Side effects have not been computed yet."));
-    // TODO(johnniwinther): Check that [_makeSideEffects] is only called if
-    // type inference has been disabled (explicitly or because of compile time
-    // errors).
-    return _sideEffects.putIfAbsent(element, _makeSideEffects);
-  }
-
-  static SideEffects _makeSideEffects() => new SideEffects();
-
-  @override
-  SideEffectsBuilder getSideEffectsBuilder(MemberEntity member) {
-    return _sideEffectsBuilders.putIfAbsent(
-        member, () => new SideEffectsBuilder(member));
-  }
-
-  void registerSideEffectsFree(FunctionEntity element) {
-    assert(checkEntity(element));
-    _sideEffectsFreeElements.add(element);
-    assert(!_sideEffectsBuilders.containsKey(element));
-    _sideEffectsBuilders[element] = new SideEffectsBuilder.free(element);
-  }
-
-  void computeSideEffects() {
-    assert(
-        _sideEffects == null, "Side effects have already been computed yet.");
-    _sideEffects = <FunctionEntity, SideEffects>{};
-    Iterable<SideEffectsBuilder> sideEffectsBuilders =
-        _sideEffectsBuilders.values;
-    emptyWorkList(sideEffectsBuilders);
-    for (SideEffectsBuilder sideEffectsBuilder in sideEffectsBuilders) {
-      _sideEffects[sideEffectsBuilder.member] = sideEffectsBuilder.sideEffects;
-    }
-    _sideEffectsBuilders = null;
-  }
-
-  static void emptyWorkList(Iterable<SideEffectsBuilder> sideEffectsBuilders) {
-    // TODO(johnniwinther): Optimize this algorithm, possibly by using
-    // `pkg/front_end/lib/src/dependency_walker.dart`.
-    Queue<SideEffectsBuilder> queue = new Queue<SideEffectsBuilder>();
-    Set<SideEffectsBuilder> inQueue = new Set<SideEffectsBuilder>();
-
-    for (SideEffectsBuilder builder in sideEffectsBuilders) {
-      queue.addLast(builder);
-      inQueue.add(builder);
-    }
-    while (queue.isNotEmpty) {
-      SideEffectsBuilder sideEffectsBuilder = queue.removeFirst();
-      inQueue.remove(sideEffectsBuilder);
-      for (SideEffectsBuilder dependent in sideEffectsBuilder.depending) {
-        if (dependent.add(sideEffectsBuilder.sideEffects)) {
-          if (inQueue.add(dependent)) {
-            queue.addLast(dependent);
-          }
-        }
-      }
-    }
-  }
-
-  void addFunctionCalledInLoop(MemberEntity element) {
-    assert(checkEntity(element));
-    _functionsCalledInLoop.add(element);
-  }
-
-  bool isCalledInLoop(MemberEntity element) {
-    assert(checkEntity(element));
-    return _functionsCalledInLoop.contains(element);
-  }
-
-  void registerCannotThrow(FunctionEntity element) {
-    assert(checkEntity(element));
-    _elementsThatCannotThrow.add(element);
-  }
-
-  bool getCannotThrow(FunctionEntity element) {
-    return _elementsThatCannotThrow.contains(element);
-  }
-
-  void registerMightBePassedToApply(FunctionEntity element) {
-    _functionsThatMightBePassedToApply.add(element);
-  }
-
-  bool getMightBePassedToApply(FunctionEntity element) {
-    // We assume all functions reach Function.apply if no functions are
-    // registered so.  We get an empty set in two circumstances (1) a trivial
-    // program and (2) when compiling without type inference
-    // (i.e. --disable-type-inference). Returning `true` has consequences (extra
-    // metadata for Function.apply) only when Function.apply is also part of the
-    // program. It is an unusual trivial program that includes Function.apply
-    // but does not call it on a function.
-    //
-    // TODO(sra): We should reverse the sense of this set and register functions
-    // that we have proven do not reach Function.apply.
-    if (_functionsThatMightBePassedToApply.isEmpty) return true;
-    return _functionsThatMightBePassedToApply.contains(element);
-  }
-
-  @override
-  bool getCurrentlyKnownMightBePassedToApply(FunctionEntity element) {
-    return _functionsThatMightBePassedToApply.contains(element);
-  }
-
   @override
   String dump([ClassEntity cls]) {
     StringBuffer sb = new StringBuffer();
@@ -1224,6 +1031,7 @@
 
 abstract class KClosedWorld {
   DartTypes get dartTypes;
+  KAllocatorAnalysis get allocatorAnalysis;
   BackendUsage get backendUsage;
   NativeData get nativeData;
   InterceptorData get interceptorData;
diff --git a/pkg/dev_compiler/bin/dartdevk.dart b/pkg/dev_compiler/bin/dartdevk.dart
index 0d01d78..98f3907 100755
--- a/pkg/dev_compiler/bin/dartdevk.dart
+++ b/pkg/dev_compiler/bin/dartdevk.dart
@@ -21,8 +21,7 @@
     await new _CompilerWorker(parsedArgs.args).run();
   } else {
     var result = await compile(parsedArgs.args);
-    var succeeded = result.result;
-    exitCode = succeeded ? 0 : 1;
+    exitCode = result.success ? 0 : 1;
   }
 }
 
@@ -45,8 +44,7 @@
     try {
       var result = await compile(args, compilerState: compilerState);
       compilerState = result.compilerState;
-      var succeeded = result.result;
-      outcome = succeeded ? 'PASS' : 'FAIL';
+      outcome = result.success ? 'PASS' : 'FAIL';
     } catch (e, s) {
       outcome = 'CRASH';
       print('Unhandled exception:');
@@ -82,7 +80,7 @@
       output.writeln(message.toString());
     }));
     return new WorkResponse()
-      ..exitCode = result.result ? 0 : 1
+      ..exitCode = result.success ? 0 : 1
       ..output = output.toString();
   }
 }
diff --git a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
index c53371c..707576a 100644
--- a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
@@ -49,7 +49,7 @@
 import 'extension_types.dart' show ExtensionTypeSet;
 import 'js_interop.dart';
 import 'js_typeref_codegen.dart' show JSTypeRefCodegen;
-import 'js_typerep.dart' show JSTypeRep, JSType;
+import 'js_typerep.dart';
 import 'module_compiler.dart' show BuildUnit, CompilerOptions, JSModuleFile;
 import 'nullable_type_inference.dart' show NullableTypeInference;
 import 'property_model.dart';
@@ -84,7 +84,7 @@
 
   final CompilerOptions options;
   final StrongTypeSystemImpl rules;
-  JSTypeRep _typeRep;
+  JSTypeRep jsTypeRep;
 
   /// The set of libraries we are currently compiling, and the temporaries used
   /// to refer to them.
@@ -136,12 +136,8 @@
   /// The dart:core `identical` element.
   final FunctionElement _coreIdentical;
 
-  /// The dart:_interceptors implementation elements.
+  /// Classes and types defined in the SDK.
   final ClassElement _jsArray;
-  final ClassElement _jsBool;
-  final ClassElement _jsNumber;
-  final ClassElement _jsString;
-
   final ClassElement boolClass;
   final ClassElement intClass;
   final ClassElement doubleClass;
@@ -213,40 +209,32 @@
       : context = c,
         rules = new StrongTypeSystemImpl(c.typeProvider),
         types = c.typeProvider,
-        _asyncStreamIterator =
-            _getLibrary(c, 'dart:async').getType('StreamIterator').type,
+        _asyncStreamIterator = getClass(c, 'dart:async', 'StreamIterator').type,
         _coreIdentical = _getLibrary(c, 'dart:core')
             .publicNamespace
             .get('identical') as FunctionElement,
-        _jsArray = _getLibrary(c, 'dart:_interceptors').getType('JSArray'),
-        _jsBool = _getLibrary(c, 'dart:_interceptors').getType('JSBool'),
-        _jsString = _getLibrary(c, 'dart:_interceptors').getType('JSString'),
-        _jsNumber = _getLibrary(c, 'dart:_interceptors').getType('JSNumber'),
-        interceptorClass =
-            _getLibrary(c, 'dart:_interceptors').getType('Interceptor'),
+        _jsArray = getClass(c, 'dart:_interceptors', 'JSArray'),
+        interceptorClass = getClass(c, 'dart:_interceptors', 'Interceptor'),
         coreLibrary = _getLibrary(c, 'dart:core'),
-        boolClass = _getLibrary(c, 'dart:core').getType('bool'),
-        intClass = _getLibrary(c, 'dart:core').getType('int'),
-        doubleClass = _getLibrary(c, 'dart:core').getType('double'),
-        numClass = _getLibrary(c, 'dart:core').getType('num'),
-        nullClass = _getLibrary(c, 'dart:core').getType('Null'),
-        objectClass = _getLibrary(c, 'dart:core').getType('Object'),
-        stringClass = _getLibrary(c, 'dart:core').getType('String'),
-        functionClass = _getLibrary(c, 'dart:core').getType('Function'),
-        privateSymbolClass =
-            _getLibrary(c, 'dart:_js_helper').getType('PrivateSymbol'),
+        boolClass = getClass(c, 'dart:core', 'bool'),
+        intClass = getClass(c, 'dart:core', 'int'),
+        doubleClass = getClass(c, 'dart:core', 'double'),
+        numClass = getClass(c, 'dart:core', 'num'),
+        nullClass = getClass(c, 'dart:core', 'Null'),
+        objectClass = getClass(c, 'dart:core', 'Object'),
+        stringClass = getClass(c, 'dart:core', 'String'),
+        functionClass = getClass(c, 'dart:core', 'Function'),
+        privateSymbolClass = getClass(c, 'dart:_js_helper', 'PrivateSymbol'),
         linkedHashMapImplType =
-            _getLibrary(c, 'dart:_js_helper').getType('LinkedMap').type,
+            getClass(c, 'dart:_js_helper', 'LinkedMap').type,
         identityHashMapImplType =
-            _getLibrary(c, 'dart:_js_helper').getType('IdentityMap').type,
-        linkedHashSetImplType =
-            _getLibrary(c, 'dart:collection').getType('_HashSet').type,
+            getClass(c, 'dart:_js_helper', 'IdentityMap').type,
+        linkedHashSetImplType = getClass(c, 'dart:collection', '_HashSet').type,
         identityHashSetImplType =
-            _getLibrary(c, 'dart:collection').getType('_IdentityHashSet').type,
-        syncIterableType =
-            _getLibrary(c, 'dart:_js_helper').getType('SyncIterable').type,
+            getClass(c, 'dart:collection', '_IdentityHashSet').type,
+        syncIterableType = getClass(c, 'dart:_js_helper', 'SyncIterable').type,
         dartJSLibrary = _getLibrary(c, 'dart:js') {
-    _typeRep = new JSTypeRep(rules, types);
+    jsTypeRep = new JSTypeRep(rules, c);
   }
 
   LibraryElement get currentLibrary => _currentElement.library;
@@ -782,7 +770,7 @@
     }
 
     // All Dart number types map to a JS double.
-    if (_typeRep.isNumber(from) && _typeRep.isNumber(to)) {
+    if (jsTypeRep.isNumber(from) && jsTypeRep.isNumber(to)) {
       // Make sure to check when converting to int.
       if (from != types.intType && to == types.intType) {
         // TODO(jmesserly): fuse this with notNull check.
@@ -805,7 +793,7 @@
     JS.Expression result;
     var type = node.type.type;
     var lhs = _visitExpression(node.expression);
-    var typeofName = _jsTypeofName(type);
+    var typeofName = jsTypeRep.typeFor(type).primitiveTypeOf;
     // Inline primitives other than int (which requires a Math.floor check).
     if (typeofName != null && type != types.intType) {
       result = js.call('typeof # == #', [lhs, js.string(typeofName, "'")]);
@@ -821,13 +809,6 @@
     return result;
   }
 
-  String _jsTypeofName(DartType t) {
-    if (_typeRep.isNumber(t)) return 'number';
-    if (t == types.stringType) return 'string';
-    if (t == types.boolType) return 'boolean';
-    return null;
-  }
-
   @override
   visitFunctionTypeAlias(FunctionTypeAlias node) => _emitTypedef(node);
 
@@ -1673,7 +1654,7 @@
       // Pass along all arguments verbatim, and let the callee handle them.
       // TODO(jmesserly): we'll need something different once we have
       // rest/spread support, but this should work for now.
-      var params = _emitFormalParameters(node.parameters?.parameters);
+      var params = _emitParameters(node.parameters?.parameters);
 
       fun = new JS.Fun(
           params,
@@ -1690,7 +1671,7 @@
       if (init != null) body.add(init);
       body.add(_visitStatement(node.body));
 
-      var params = _emitFormalParameters(node.parameters?.parameters);
+      var params = _emitParameters(node.parameters?.parameters);
       fun = new JS.Fun(params, new JS.Block(body), returnType: returnType);
     }
 
@@ -1909,7 +1890,7 @@
   void _registerExtensionType(
       ClassElement classElem, String jsPeerName, List<JS.Statement> body) {
     var className = _emitTopLevelName(classElem);
-    if (isPrimitiveType(classElem.type)) {
+    if (jsTypeRep.isPrimitive(classElem.type)) {
       body.add(
           runtimeStatement('definePrimitiveHashCode(#.prototype)', className));
     }
@@ -2291,7 +2272,7 @@
 
   JS.Expression _emitConstructor(ConstructorDeclaration node,
       List<VariableDeclaration> fields, JS.Expression className) {
-    var params = _emitFormalParameters(node.parameters?.parameters);
+    var params = _emitParameters(node.parameters?.parameters);
 
     var savedFunction = _currentFunction;
     _currentFunction = node.body;
@@ -2603,7 +2584,7 @@
     if (node.isGetter) {
       return new JS.Fun([], js.block('{ return this.#; }', [name]));
     } else if (node.isSetter) {
-      var params = _emitFormalParameters(node.parameters?.parameters);
+      var params = _emitParameters(node.parameters?.parameters);
       return new JS.Fun(
           params, js.block('{ this.# = #; }', [name, params.last]));
     } else {
@@ -2807,7 +2788,7 @@
 
     // normal function (sync), vs (sync*, async, async*)
     var isSync = !(element.isAsynchronous || element.isGenerator);
-    var formals = _emitFormalParameters(parameters?.parameters);
+    var formals = _emitParameters(parameters?.parameters);
     var typeFormals = _emitTypeFormals(type.typeFormals);
     if (_reifyGeneric(element)) formals.insertAll(0, typeFormals);
 
@@ -2936,7 +2917,7 @@
 
       var params = parameters?.parameters;
 
-      var jsParams = _emitFormalParameters(
+      var jsParams = _emitParameters(
           params?.where((p) => isPotentiallyMutated(body, p.element)));
 
       var gen = emitGeneratorFn(jsParams);
@@ -3847,7 +3828,7 @@
     if (_isNull(left) || _isNull(right)) return true;
     // If the representation of the  two types will not induce conversion in
     // JS then we can use == .
-    return !_typeRep.equalityMayConvert(left.staticType, right.staticType);
+    return !jsTypeRep.equalityMayConvert(left.staticType, right.staticType);
   }
 
   bool _tripleEqIsIdentity(Expression left, Expression right) {
@@ -4111,8 +4092,7 @@
     return jsParams;
   }
 
-  List<JS.Parameter> _emitFormalParameters(
-      Iterable<FormalParameter> parameters) {
+  List<JS.Parameter> _emitParameters(Iterable<FormalParameter> parameters) {
     if (parameters == null) return [];
 
     var result = <JS.Parameter>[];
@@ -4579,21 +4559,6 @@
         ctorNode: constructor);
   }
 
-  bool isPrimitiveType(DartType t) => _typeRep.isPrimitive(t);
-
-  /// Given a Dart type return the known implementation type, if any.
-  /// Given `bool`, `String`, or `num`/`int`/`double`,
-  /// returns the corresponding type in `dart:_interceptors`:
-  /// `JSBool`, `JSString`, and `JSNumber` respectively, otherwise null.
-  InterfaceType getImplementationType(DartType t) {
-    JSType rep = _typeRep.typeFor(t);
-    // Number, String, and Bool are final
-    if (rep == JSType.jsNumber) return _jsNumber.type;
-    if (rep == JSType.jsBoolean) return _jsBool.type;
-    if (rep == JSType.jsString) return _jsString.type;
-    return null;
-  }
-
   JS.Statement _nullParameterCheck(JS.Expression param) {
     var call = runtimeCall('argumentError((#))', [param]);
     return js.statement('if (# == null) #;', [param, call]);
@@ -4633,7 +4598,7 @@
     // if `operator ==` was overridden, similar to how we devirtualize private
     // fields.
     var isEnum = leftType is InterfaceType && leftType.element.isEnum;
-    var usesIdentity = _typeRep.isPrimitive(leftType) ||
+    var usesIdentity = jsTypeRep.isPrimitive(leftType) ||
         isEnum ||
         _isNull(left) ||
         _isNull(right);
@@ -4699,7 +4664,7 @@
         ..sourceInformation = _getLocation(node.operator.offset);
     }
 
-    if (_typeRep.binaryOperationIsPrimitive(leftType, rightType) ||
+    if (jsTypeRep.binaryOperationIsPrimitive(leftType, rightType) ||
         leftType == types.stringType && op.type == TokenType.PLUS) {
       // special cases where we inline the operation
       // these values are assumed to be non-null (determined by the checker)
@@ -5087,7 +5052,7 @@
     var expr = node.operand;
 
     var dispatchType = getStaticType(expr);
-    if (_typeRep.unaryOperationIsPrimitive(dispatchType)) {
+    if (jsTypeRep.unaryOperationIsPrimitive(dispatchType)) {
       if (!isNullable(expr)) {
         return js.call('#$op', _visitExpression(expr));
       }
@@ -5124,9 +5089,9 @@
     var expr = node.operand;
 
     var dispatchType = getStaticType(expr);
-    if (_typeRep.unaryOperationIsPrimitive(dispatchType)) {
+    if (jsTypeRep.unaryOperationIsPrimitive(dispatchType)) {
       if (op.lexeme == '~') {
-        if (_typeRep.isNumber(dispatchType)) {
+        if (jsTypeRep.isNumber(dispatchType)) {
           JS.Expression jsExpr = js.call('~#', notNull(expr));
           return _coerceBitOperationResultToUnsigned(node, jsExpr);
         }
@@ -5793,7 +5758,7 @@
   JS.Expression _emitMapImplType(InterfaceType type, {bool identity}) {
     var typeArgs = type.typeArguments;
     if (typeArgs.isEmpty) return _emitType(type);
-    identity ??= isPrimitiveType(typeArgs[0]);
+    identity ??= jsTypeRep.isPrimitive(typeArgs[0]);
     type = identity ? identityHashMapImplType : linkedHashMapImplType;
     return _emitType(type.instantiate(typeArgs));
   }
@@ -5801,7 +5766,7 @@
   JS.Expression _emitSetImplType(InterfaceType type, {bool identity}) {
     var typeArgs = type.typeArguments;
     if (typeArgs.isEmpty) return _emitType(type);
-    identity ??= isPrimitiveType(typeArgs[0]);
+    identity ??= jsTypeRep.isPrimitive(typeArgs[0]);
     type = identity ? identityHashSetImplType : linkedHashSetImplType;
     return _emitType(type.instantiate(typeArgs));
   }
@@ -5819,27 +5784,21 @@
 
   @override
   JS.Expression visitStringInterpolation(StringInterpolation node) {
-    var strings = <String>[];
-    var interpolations = <JS.Expression>[];
-
-    var expectString = true;
-    for (var e in node.elements) {
-      if (e is InterpolationString) {
-        assert(expectString);
-        expectString = false;
-
-        // Escape the string as necessary for use in the eventual `` quotes.
-        // TODO(jmesserly): this call adds quotes, and then we strip them off.
-        var str = js.escapedString(e.value, '`').value;
-        strings.add(str.substring(1, str.length - 1));
+    var parts = <JS.Expression>[];
+    for (var elem in node.elements) {
+      if (elem is InterpolationString) {
+        if (elem.value.isEmpty) continue;
+        parts.add(js.escapedString(elem.value, '"'));
       } else {
-        assert(!expectString);
-        expectString = true;
-        interpolations.add(_visitExpression(e));
+        var e = (elem as InterpolationExpression).expression;
+        var jsExpr = _visitExpression(e);
+        parts.add(e.staticType == types.stringType && !isNullable(e)
+            ? jsExpr
+            : runtimeCall('str(#)', jsExpr));
       }
     }
-    return new JS.TaggedTemplate(
-        runtimeCall('str'), new JS.TemplateString(strings, interpolations));
+    if (parts.isEmpty) return js.string('');
+    return new JS.Expression.binary(parts, '+');
   }
 
   @override
@@ -6172,7 +6131,7 @@
     if (type == null || type.isDynamic || type.isObject) {
       return isObjectMember(name);
     } else if (type is InterfaceType) {
-      var interfaceType = getImplementationType(type) ?? type;
+      var interfaceType = jsTypeRep.getImplementationType(type) ?? type;
       var element = interfaceType.element;
       if (_extensionTypes.isNativeClass(element)) {
         var member = _lookupForwardedMember(element, name);
@@ -6355,7 +6314,7 @@
   @override
   visitExtendsClause(node) => _unreachable(node);
 
-  /// Unused, see [_emitFormalParameters].
+  /// Unused, see [_emitParameters].
   @override
   visitFormalParameterList(node) => _unreachable(node);
 
diff --git a/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart b/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart
index 928e5e4..8ecdd13 100644
--- a/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:collection';
+import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
 
 /// Helpers for Analyzer's Element model and corelib model.
 
@@ -45,6 +46,7 @@
 ///    (v) => v.type.name == 'Deprecated' && v.type.element.library.isDartCore
 ///
 DartObject findAnnotation(Element element, bool test(DartObjectImpl value)) {
+  if (element == null) return null;
   for (var metadata in element.metadata) {
     var value = metadata.computeConstantValue();
     if (value is DartObjectImpl && test(value)) return value;
@@ -339,3 +341,6 @@
   var path = uri.pathSegments[0];
   return uri.scheme == 'dart' && path == libraryName;
 }
+
+ClassElement getClass(AnalysisContext c, String uri, String name) =>
+    c.computeLibraryElement(c.sourceFactory.forUri(uri)).getType(name);
diff --git a/pkg/dev_compiler/lib/src/analyzer/js_typerep.dart b/pkg/dev_compiler/lib/src/analyzer/js_typerep.dart
index 2d73cb0..ba24ee2 100644
--- a/pkg/dev_compiler/lib/src/analyzer/js_typerep.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/js_typerep.dart
@@ -3,95 +3,29 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/dart/element/element.dart' show ClassElement;
+import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
 import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
 import 'package:analyzer/src/generated/type_system.dart'
     show StrongTypeSystemImpl;
+import '../compiler/js_typerep.dart';
+import 'element_helpers.dart' show getClass;
 
-/// An abstraction of the JS types
-abstract class JSType {
-  const JSType();
-
-  /// True if this type is built-in to JS, and we use the values unwrapped.
-  /// For these types we generate a calling convention via static
-  /// "extension methods". This allows types to be extended without adding
-  /// extensions directly on the prototype.
-  bool get isPrimitive;
-
-  /// Is this type known to be definitively primitive
-  /// (using the JS notion of primitive)
-  bool get isPrimitiveInJS;
-
-  /// Can a non-null element of this type potentially be interpreted
-  /// as false in JS.
-  bool get isFalsey;
-
-  static const jsBoolean = const JSBoolean();
-  static const jsNumber = const JSNumber();
-  static const jsNull = const JSNull();
-  static const jsObject = const JSObject();
-  static const jsString = const JSString();
-  static const jsUnknown = const JSUnknown();
-}
-
-/// Inhabited by booleans (including JSBool), null, and undefined
-class JSBoolean extends JSType {
-  const JSBoolean();
-  bool get isPrimitive => true;
-  bool get isPrimitiveInJS => true;
-  bool get isFalsey => true;
-}
-
-/// Inhabited by numbers, null, and undefined
-/// In practice, this is 4 types: num, int, double, and _interceptors.JSNumber.
-///
-/// _interceptors.JSNumber is the type that actually "implements" all numbers,
-/// hence it's a subtype of int and double (and num).
-/// It's defined in our "dart:_interceptors".
-class JSNumber extends JSType {
-  const JSNumber();
-  bool get isPrimitive => true;
-  bool get isPrimitiveInJS => true;
-  bool get isFalsey => true;
-}
-
-/// Inhabited by null and undefined
-class JSNull extends JSType {
-  const JSNull();
-  bool get isPrimitive => false;
-  bool get isPrimitiveInJS => false;
-  bool get isFalsey => true;
-}
-
-/// Inhabited by objects, null, and undefined
-class JSObject extends JSType {
-  const JSObject();
-  bool get isPrimitive => false;
-  bool get isPrimitiveInJS => false;
-  bool get isFalsey => false;
-}
-
-/// Inhabited by strings (including JSString), null, and undefined
-class JSString extends JSType {
-  const JSString();
-  bool get isPrimitive => true;
-  bool get isPrimitiveInJS => false;
-  bool get isFalsey => true;
-}
-
-/// Inhabitance not statically known
-class JSUnknown extends JSType {
-  const JSUnknown();
-  bool get isPrimitive => false;
-  bool get isPrimitiveInJS => false;
-  bool get isFalsey => true;
-}
-
-class JSTypeRep {
+class JSTypeRep extends SharedJSTypeRep<DartType> {
   final StrongTypeSystemImpl rules;
   final TypeProvider types;
 
-  JSTypeRep(this.rules, this.types);
+  final ClassElement _jsBool;
+  final ClassElement _jsNumber;
+  final ClassElement _jsString;
 
+  JSTypeRep(this.rules, AnalysisContext c)
+      : types = c.typeProvider,
+        _jsBool = getClass(c, 'dart:_interceptors', 'JSBool'),
+        _jsString = getClass(c, 'dart:_interceptors', 'JSString'),
+        _jsNumber = getClass(c, 'dart:_interceptors', 'JSNumber');
+
+  @override
   JSType typeFor(DartType type) {
     while (type is TypeParameterType) {
       type = (type as TypeParameterType).element.bound;
@@ -115,40 +49,16 @@
     return JSType.jsObject;
   }
 
-  /// If the type [t] is [int] or [double], or a type parameter
-  /// bounded by [int], [double] or [num] returns [num].
-  /// Otherwise returns [t].
-  DartType canonicalizeNumTypes(DartType t) => isNumber(t) ? types.numType : t;
-
-  bool isNumber(DartType type) => typeFor(type) is JSNumber;
-
-  /// Is this type known to be represented as Object or Null in JS.
-  bool isObjectOrNull(DartType t) {
+  /// Given a Dart type return the known implementation type, if any.
+  /// Given `bool`, `String`, or `num`/`int`/`double`,
+  /// returns the corresponding type in `dart:_interceptors`:
+  /// `JSBool`, `JSString`, and `JSNumber` respectively, otherwise null.
+  InterfaceType getImplementationType(DartType t) {
     var rep = typeFor(t);
-    return rep is JSObject || rep is JSNull;
-  }
-
-  bool isUnknown(DartType t) => typeFor(t) is JSUnknown;
-
-  bool isPrimitive(DartType t) => typeFor(t).isPrimitive;
-
-  bool isPrimitiveInJS(DartType t) => typeFor(t).isPrimitiveInJS;
-
-  bool binaryOperationIsPrimitive(DartType leftT, DartType rightT) =>
-      isPrimitiveInJS(leftT) && isPrimitiveInJS(rightT);
-
-  bool unaryOperationIsPrimitive(DartType t) => isPrimitiveInJS(t);
-
-  /// True if the JS double equals (`==`) comparison on the representation
-  /// of these two types could potentially cause a conversion.
-  bool equalityMayConvert(DartType t0, DartType t1) => !equalOrNull(t0, t1);
-
-  // Are t0 and t1 known to either be represented by the same type
-  // or else one or both of them is represented by Null
-  bool equalOrNull(DartType t0, DartType t1) {
-    var rep0 = typeFor(t0);
-    var rep1 = typeFor(t1);
-    if (rep0 is JSNull || rep1 is JSNull) return true;
-    return rep0 == rep1 && rep0 is! JSUnknown;
+    // Number, String, and Bool are final
+    if (rep == JSType.jsNumber) return _jsNumber.type;
+    if (rep == JSType.jsBoolean) return _jsBool.type;
+    if (rep == JSType.jsString) return _jsString.type;
+    return null;
   }
 }
diff --git a/pkg/dev_compiler/lib/src/analyzer/nullable_type_inference.dart b/pkg/dev_compiler/lib/src/analyzer/nullable_type_inference.dart
index 5006b76..6ef6e1f 100644
--- a/pkg/dev_compiler/lib/src/analyzer/nullable_type_inference.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/nullable_type_inference.dart
@@ -11,6 +11,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'element_helpers.dart' show getStaticType, isInlineJS, findAnnotation;
 import 'js_interop.dart' show isNotNullAnnotation, isNullCheckAnnotation;
+import 'js_typerep.dart';
 import 'property_model.dart';
 
 /// An inference engine for nullable types.
@@ -27,8 +28,7 @@
   LibraryElement get coreLibrary;
   VirtualFieldModel get virtualFields;
 
-  InterfaceType getImplementationType(DartType type);
-  bool isPrimitiveType(DartType type);
+  JSTypeRep get jsTypeRep;
   bool isObjectMember(String name);
 
   /// Known non-null local variables.
@@ -85,7 +85,7 @@
       Element container = e.enclosingElement;
       if (container is ClassElement) {
         DartType targetType = container.type;
-        InterfaceType implType = getImplementationType(targetType);
+        InterfaceType implType = jsTypeRep.getImplementationType(targetType);
         if (implType != null) {
           MethodElement method = implType.lookUpMethod(e.name, coreLibrary);
           if (method != null) e = method;
@@ -109,7 +109,7 @@
     Element container = element.enclosingElement;
     if (container is ClassElement) {
       var targetType = container.type;
-      var implType = getImplementationType(targetType);
+      var implType = jsTypeRep.getImplementationType(targetType);
       if (implType != null) {
         var getter = implType.lookUpGetter(name, coreLibrary);
         if (getter != null) element = getter;
@@ -237,36 +237,51 @@
 
       return true;
     }
-
-    DartType type = null;
-    if (expr is BinaryExpression) {
-      switch (expr.operator.type) {
-        case TokenType.EQ_EQ:
-        case TokenType.BANG_EQ:
-        case TokenType.AMPERSAND_AMPERSAND:
-        case TokenType.BAR_BAR:
-          return false;
-        case TokenType.QUESTION_QUESTION:
-          return _isNullable(expr.leftOperand, localIsNullable) &&
-              _isNullable(expr.rightOperand, localIsNullable);
-      }
-      type = getStaticType(expr.leftOperand);
-    } else if (expr is PrefixExpression) {
-      if (expr.operator.type == TokenType.BANG) return false;
-      type = getStaticType(expr.operand);
-    } else if (expr is PostfixExpression) {
-      type = getStaticType(expr.operand);
-    }
-    if (type != null && isPrimitiveType(type)) {
-      return false;
-    }
     if (expr is MethodInvocation &&
-        (expr.operator?.type != TokenType.QUESTION_PERIOD ||
+        (expr.operator?.lexeme != '?.' ||
             !_isNullable(expr.target, localIsNullable)) &&
         _isNonNullMethodInvocation(expr)) {
       return false;
     }
 
+    Expression operand, rightOperand;
+    String op;
+    if (expr is AssignmentExpression) {
+      op = expr.operator.lexeme;
+      assert(op.endsWith('='));
+      if (op == '=') {
+        return _isNullable(expr.rightHandSide, localIsNullable);
+      }
+      // op assignment like +=, remove trailing '='
+      op = op.substring(0, op.length - 1);
+      operand = expr.leftHandSide;
+      rightOperand = expr.rightHandSide;
+    } else if (expr is BinaryExpression) {
+      operand = expr.leftOperand;
+      rightOperand = expr.rightOperand;
+      op = expr.operator.lexeme;
+    } else if (expr is PrefixExpression) {
+      operand = expr.operand;
+      op = expr.operator.lexeme;
+    } else if (expr is PostfixExpression) {
+      operand = expr.operand;
+      op = expr.operator.lexeme;
+    }
+    switch (op) {
+      case '==':
+      case '!=':
+      case '&&':
+      case '||':
+      case '!':
+        return false;
+      case '??':
+        return _isNullable(operand, localIsNullable) &&
+            _isNullable(rightOperand, localIsNullable);
+    }
+    if (operand != null && jsTypeRep.isPrimitive(getStaticType(operand))) {
+      return false;
+    }
+
     // TODO(ochafik,jmesserly): handle other cases such as: refs to top-level
     // finals that have been assigned non-nullable values.
 
@@ -370,17 +385,12 @@
 
   @override
   visitAssignmentExpression(AssignmentExpression node) {
-    _visitAssignment(node.leftHandSide, node.rightHandSide);
-    super.visitAssignmentExpression(node);
-  }
-
-  @override
-  visitBinaryExpression(BinaryExpression node) {
-    var op = node.operator.type;
-    if (op.isAssignmentOperator) {
-      _visitAssignment(node.leftOperand, node);
+    if (node.operator.lexeme == '=') {
+      _visitAssignment(node.leftHandSide, node.rightHandSide);
+    } else {
+      _visitAssignment(node.leftHandSide, node);
     }
-    super.visitBinaryExpression(node);
+    super.visitAssignmentExpression(node);
   }
 
   @override
diff --git a/pkg/dev_compiler/lib/src/compiler/js_typerep.dart b/pkg/dev_compiler/lib/src/compiler/js_typerep.dart
new file mode 100644
index 0000000..56a0545
--- /dev/null
+++ b/pkg/dev_compiler/lib/src/compiler/js_typerep.dart
@@ -0,0 +1,121 @@
+/// An abstraction of the JS types
+abstract class JSType {
+  const JSType();
+
+  /// True if this type is built-in to JS, and we use the values unwrapped.
+  /// For these types we generate a calling convention via static
+  /// "extension methods". This allows types to be extended without adding
+  /// extensions directly on the prototype.
+  bool get isPrimitive;
+
+  /// Is this type known to be definitively primitive
+  /// (using the JS notion of primitive)
+  bool get isPrimitiveInJS;
+
+  /// Can a non-null element of this type potentially be interpreted
+  /// as false in JS.
+  bool get isFalsey;
+
+  /// The JS `typeof` value, if unambiguous.
+  String get primitiveTypeOf => null;
+
+  static const jsBoolean = const JSBoolean();
+  static const jsNumber = const JSNumber();
+  static const jsNull = const JSNull();
+  static const jsObject = const JSObject();
+  static const jsString = const JSString();
+  static const jsUnknown = const JSUnknown();
+  // TODO(jmesserly): add JSFunction that maps to Dart's `Function` type.
+}
+
+/// Inhabited by booleans (including JSBool), null, and undefined
+class JSBoolean extends JSType {
+  const JSBoolean();
+  bool get isPrimitive => true;
+  bool get isPrimitiveInJS => true;
+  bool get isFalsey => true;
+  String get primitiveTypeOf => 'boolean';
+}
+
+/// Inhabited by numbers, null, and undefined
+/// In practice, this is 4 types: num, int, double, and _interceptors.JSNumber.
+///
+/// _interceptors.JSNumber is the type that actually "implements" all numbers,
+/// hence it's a subtype of int and double (and num).
+/// It's defined in our "dart:_interceptors".
+class JSNumber extends JSType {
+  const JSNumber();
+  bool get isPrimitive => true;
+  bool get isPrimitiveInJS => true;
+  bool get isFalsey => true;
+  String get primitiveTypeOf => 'number';
+}
+
+/// Inhabited by null and undefined
+class JSNull extends JSType {
+  const JSNull();
+  bool get isPrimitive => false;
+  bool get isPrimitiveInJS => false;
+  bool get isFalsey => true;
+}
+
+/// Inhabited by objects, null, and undefined
+class JSObject extends JSType {
+  const JSObject();
+  bool get isPrimitive => false;
+  bool get isPrimitiveInJS => false;
+  bool get isFalsey => false;
+}
+
+/// Inhabited by strings (including JSString), null, and undefined
+class JSString extends JSType {
+  const JSString();
+  bool get isPrimitive => true;
+  bool get isPrimitiveInJS => false;
+  bool get isFalsey => true;
+  String get primitiveTypeOf => 'string';
+}
+
+/// Inhabitance not statically known
+class JSUnknown extends JSType {
+  const JSUnknown();
+  bool get isPrimitive => false;
+  bool get isPrimitiveInJS => false;
+  bool get isFalsey => true;
+}
+
+abstract class SharedJSTypeRep<DartType> {
+  JSType typeFor(DartType type);
+
+  bool isNumber(DartType type) => typeFor(type) is JSNumber;
+
+  /// Is this type known to be represented as Object or Null in JS.
+  bool isObjectOrNull(DartType t) {
+    var rep = typeFor(t);
+    return rep is JSObject || rep is JSNull;
+  }
+
+  bool isUnknown(DartType t) => typeFor(t) is JSUnknown;
+
+  bool isPrimitive(DartType t) => typeFor(t).isPrimitive;
+
+  bool isPrimitiveInJS(DartType t) => typeFor(t).isPrimitiveInJS;
+
+  bool binaryOperationIsPrimitive(DartType leftT, DartType rightT) =>
+      isPrimitiveInJS(leftT) && isPrimitiveInJS(rightT);
+
+  bool unaryOperationIsPrimitive(DartType t) => isPrimitiveInJS(t);
+
+  /// True if the JS double equals (`==`) comparison on the representation
+  /// of these two types could potentially cause a conversion.
+  bool equalityMayConvert(DartType t0, DartType t1) => !equalOrNull(t0, t1);
+
+  // Are t0 and t1 known to either be represented by the same type
+  // or else one or both of them is represented by Null
+  bool equalOrNull(DartType t0, DartType t1) {
+    var rep0 = typeFor(t0);
+    var rep1 = typeFor(t1);
+    if (rep0 is JSNull || rep1 is JSNull) return true;
+    return rep0 == rep1 && rep0 is! JSUnknown;
+  }
+}
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index f8a4624..cd9aaf9 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -11,8 +11,10 @@
 import 'package:front_end/src/api_prototype/standard_file_system.dart';
 import 'package:front_end/src/api_unstable/ddc.dart' as fe;
 import 'package:kernel/kernel.dart';
+import 'package:kernel/text/ast_to_text.dart' as kernel show Printer;
+import 'package:kernel/binary/ast_to_binary.dart' as kernel show BinaryPrinter;
 import 'package:path/path.dart' as path;
-import 'package:source_maps/source_maps.dart';
+import 'package:source_maps/source_maps.dart' show SourceMapBuilder;
 
 import '../compiler/js_names.dart' as JS;
 import '../compiler/module_builder.dart';
@@ -98,11 +100,11 @@
 
 class CompilerResult {
   final fe.InitializedCompilerState compilerState;
-  final bool result;
+  final bool success;
 
-  CompilerResult(this.compilerState, this.result);
+  CompilerResult(this.compilerState, this.success);
 
-  CompilerResult.noState(this.result) : compilerState = null;
+  CompilerResult.noState(this.success) : compilerState = null;
 }
 
 Future<CompilerResult> _compile(List<String> args,
@@ -113,9 +115,31 @@
         abbr: 'h', help: 'Display this message.', negatable: false)
     ..addOption('out', abbr: 'o', help: 'Output file (required).')
     ..addOption('packages', help: 'The package spec file to use.')
+    ..addFlag('summarize',
+        help: 'emit API summary in a .dill file', defaultsTo: true)
+    // TODO(jmesserly): should default to `false` and be hidden.
+    // For now this is very helpful in debugging the compiler.
+    ..addFlag('summarize-text',
+        help: 'emit API summary in a .js.txt file', defaultsTo: true)
     // TODO(jmesserly): add verbose help to show hidden options
     ..addOption('dart-sdk-summary',
         help: 'The path to the Dart SDK summary file.', hide: true)
+    // TODO(jmesserly): this help description length is too long.
+    //
+    // Also summary-input-dir and custom-app-scheme should be removed.
+    // They are undocumented and not necessary.
+    //
+    // URIs can be passed to `--summary` (including relative ones if desired),
+    // and we can easily add logic to prevert absolute file URIs in source maps.
+    //
+    // It appears to have been added in this change, but none of the flags are
+    // described there:
+    // https://github.com/dart-lang/sdk/commit/226602dc189555d9a43785c2a2f599b1622c1890
+    //
+    // Looking at the code, it appears to be solving a similar problem as
+    // `--module-root` in our old Analyzer-based backend.
+    // See https://github.com/dart-lang/sdk/issues/32272 for context on removing
+    // --module-root.
     ..addMultiOption('summary',
         abbr: 's',
         help: 'path to a summary of a transitive dependency of this module.\n'
@@ -186,8 +210,9 @@
   var fileSystem = new MultiRootFileSystem(
       customScheme, multiRoots, StandardFileSystem.instance);
 
+  var oldCompilerState = compilerState;
   compilerState = await fe.initializeCompiler(
-      compilerState,
+      oldCompilerState,
       stringToUri(sdkSummaryPath),
       stringToUri(packageFile),
       summaryUris,
@@ -206,13 +231,29 @@
 
   String output = argResults['out'];
   var file = new File(output);
-  if (!file.parent.existsSync()) file.parent.createSync(recursive: true);
+  await file.parent.create(recursive: true);
 
-  // TODO(jmesserly): Save .dill file so other modules can link in this one.
-  //await writeComponentToBinary(component, output);
-
-  // Useful for debugging:
-  writeComponentToText(component, path: output + '.txt');
+  // Output files can be written in parallel, so collect the futures.
+  var outFiles = <Future>[];
+  if (argResults['summarize'] as bool) {
+    // TODO(jmesserly): CFE mutates the Kernel tree, so we can't save the dill
+    // file if we successfully reused a cached library. If compiler state is
+    // unchanged, it means we used the cache.
+    //
+    // In that case, we need to unbind canonical names, because they could be
+    // bound already from the previous compile.
+    if (identical(compilerState, oldCompilerState)) {
+      component.unbindCanonicalNames();
+    }
+    var sink = new File(path.withoutExtension(output) + '.dill').openWrite();
+    new kernel.BinaryPrinter(sink).writeComponentFile(component);
+    outFiles.add(sink.flush().then((_) => sink.close()));
+  }
+  if (argResults['summarize-text'] as bool) {
+    var sink = new File(output + '.txt').openWrite();
+    new kernel.Printer(sink, showExternal: false).writeComponentFile(component);
+    outFiles.add(sink.flush().then((_) => sink.close()));
+  }
 
   var compiler = new ProgramCompiler(component,
       declaredVariables: declaredVariables,
@@ -226,14 +267,14 @@
       jsUrl: path.toUri(output).toString(),
       mapUrl: path.toUri(output + '.map').toString(),
       customScheme: customScheme);
-  file.writeAsStringSync(jsCode.code);
 
+  outFiles.add(file.writeAsString(jsCode.code));
   if (jsCode.sourceMap != null) {
-    file = new File(output + '.map');
-    if (!file.parent.existsSync()) file.parent.createSync(recursive: true);
-    file.writeAsStringSync(json.encode(jsCode.sourceMap));
+    outFiles.add(
+        new File(output + '.map').writeAsString(json.encode(jsCode.sourceMap)));
   }
 
+  await Future.wait(outFiles);
   return new CompilerResult(compilerState, true);
 }
 
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index a8478d6..bf7fea8 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -181,9 +181,6 @@
   final _labelNames = new HashMap<Statement, String>.identity();
 
   final Class _jsArrayClass;
-  final Class _jsBoolClass;
-  final Class _jsNumberClass;
-  final Class _jsStringClass;
   final Class privateSymbolClass;
   final Class linkedHashMapImplClass;
   final Class identityHashMapImplClass;
@@ -220,9 +217,6 @@
       this._constants, this.types, this._typeRep, this._nullableInference,
       {this.emitMetadata, this.enableAsserts, this.replCompile})
       : _jsArrayClass = sdk.getClass('dart:_interceptors', 'JSArray'),
-        _jsBoolClass = sdk.getClass('dart:_interceptors', 'JSBool'),
-        _jsNumberClass = sdk.getClass('dart:_interceptors', 'JSNumber'),
-        _jsStringClass = sdk.getClass('dart:_interceptors', 'JSString'),
         _asyncStreamIteratorClass =
             sdk.getClass('dart:async', 'StreamIterator'),
         privateSymbolClass = sdk.getClass('dart:_js_helper', 'PrivateSymbol'),
@@ -718,7 +712,7 @@
       for (var ctor in superclass.constructors) {
         var savedUri = _currentUri;
         _currentUri = ctor.enclosingClass.fileUri;
-        var jsParams = _emitFormalParameters(ctor.function);
+        var jsParams = _emitParameters(ctor.function);
         _currentUri = savedUri;
         var ctorBody = <JS.Statement>[];
         if (mixinCtor != null) ctorBody.add(mixinCtor);
@@ -1177,7 +1171,8 @@
       ]));
     }
 
-    var extMembers = _classProperties.extensionMethods;
+    var extMethods = _classProperties.extensionMethods;
+    var extAccessors = _classProperties.extensionAccessors;
     var staticMethods = <JS.Property>[];
     var instanceMethods = <JS.Property>[];
     var staticGetters = <JS.Property>[];
@@ -1241,7 +1236,8 @@
         var property = new JS.Property(_declareMemberName(member), type);
         var signatures = getSignatureList(member);
         signatures.add(property);
-        if (!member.isStatic && extMembers.contains(name)) {
+        if (!member.isStatic &&
+            (extMethods.contains(name) || extAccessors.contains(name))) {
           signatures.add(new JS.Property(
               _declareMemberName(member, useExtension: true), type));
         }
@@ -1349,7 +1345,7 @@
       Constructor node, List<Field> fields, JS.Expression className) {
     var savedUri = _currentUri;
     _currentUri = node.fileUri ?? savedUri;
-    var params = _emitFormalParameters(node.function);
+    var params = _emitParameters(node.function);
     var body = _withCurrentFunction(
         node.function,
         () => _superDisallowed(
@@ -1421,7 +1417,7 @@
     return js.statement('#.#.call(this, #);', [
       className,
       _constructorName(ctor.name.name),
-      _emitArgumentList(node.arguments)
+      _emitArgumentList(node.arguments, types: false)
     ]);
   }
 
@@ -1437,7 +1433,7 @@
       args = [];
     } else {
       ctor = superInit.target;
-      args = _emitArgumentList(superInit.arguments);
+      args = _emitArgumentList(superInit.arguments, types: false);
     }
     // We can skip the super call if it's empty. Most commonly this happens for
     // things that extend Object, and don't have any field initializers or their
@@ -1604,7 +1600,7 @@
     var savedUri = _currentUri;
     for (var m in c.procedures) {
       _currentUri = m.fileUri ?? savedUri;
-      if (m.isForwardingStub) {
+      if (_isForwardingStub(m)) {
         // TODO(jmesserly): is there any other kind of forwarding stub?
         jsMethods.addAll(_emitCovarianceCheckStub(m));
       } else if (m.isFactory) {
@@ -1642,6 +1638,27 @@
     return jsMethods.where((m) => m != null).toList();
   }
 
+  bool _isForwardingStub(Procedure member) {
+    if (member.isForwardingStub || member.isForwardingSemiStub) {
+      if (_currentLibrary.importUri.scheme != 'dart') return true;
+      // TODO(jmesserly): external methods in the SDK seem to get incorrectly
+      // tagged as forwarding stubs even if they are patched. Perhaps there is
+      // an ordering issue in CFE. So for now we pattern match to see if it
+      // looks like an actual forwarding stub.
+      //
+      // We may be able to work around this in a cleaner way by simply emitting
+      // the code, and letting the normal covariance check logic handle things.
+      // But currently we use _emitCovarianceCheckStub to work around some
+      // issues in the stubs.
+      var body = member.function.body;
+      if (body is ReturnStatement) {
+        var expr = body.expression;
+        return expr is SuperMethodInvocation || expr is SuperPropertySet;
+      }
+    }
+    return false;
+  }
+
   /// Emits a method, getter, or setter.
   JS.Method _emitMethodDeclaration(Procedure member) {
     if (member.isAbstract) {
@@ -1671,7 +1688,7 @@
     if (node.isGetter) {
       return new JS.Fun([], js.block('{ return this.#; }', [name]));
     } else if (node.isSetter) {
-      var params = _emitFormalParameters(node.function);
+      var params = _emitParameters(node.function);
       return new JS.Fun(
           params, js.block('{ this.# = #; }', [name, params.last]));
     } else {
@@ -1687,13 +1704,13 @@
     //   ensure soundness of the super member, so we must lookup the super
     //   member and determine checks ourselves.
     // - it generates getter stubs, but these are not used
-    if (member.isGetter) return [];
+    if (member.isGetter) return const [];
 
     var enclosingClass = member.enclosingClass;
     var superMember = member.forwardingStubSuperTarget ??
         member.forwardingStubInterfaceTarget;
 
-    if (superMember == null) return [];
+    if (superMember == null) return const [];
 
     substituteType(DartType t) {
       return _getTypeFromClass(t, superMember.enclosingClass, enclosingClass);
@@ -1704,16 +1721,15 @@
       if (superMember is Field && superMember.isGenericCovariantImpl ||
           superMember is Procedure &&
               isCovariant(superMember.function.positionalParameters[0])) {
-        return [];
+        return const [];
       }
+      var setterType = substituteType(superMember.setterType);
+      if (types.isTop(setterType)) return const [];
       return [
         new JS.Method(
             name,
-            js.fun('function(x) { return super.# = #; }', [
-              name,
-              _emitImplicitCast(new JS.Identifier('x'),
-                  substituteType(superMember.setterType))
-            ]),
+            js.fun('function(x) { return super.# = #; }',
+                [name, _emitImplicitCast(new JS.Identifier('x'), setterType)]),
             isSetter: true),
         new JS.Method(name, js.fun('function() { return super.#; }', [name]),
             isGetter: true)
@@ -1765,16 +1781,11 @@
       }
     }
 
-    if (namedParameters.isNotEmpty) jsParams.add(namedArgumentTemp);
+    if (body.isEmpty) return const []; // No checks were needed.
 
-    if (typeFormals.isEmpty) {
-      body.add(js.statement('return super.#(#);', [name, jsParams]));
-    } else {
-      body.add(
-          js.statement('return super.#(#)(#);', [name, typeFormals, jsParams]));
-    }
-    var fn = new JS.Fun(jsParams, new JS.Block(body));
-    return [new JS.Method(name, fn)];
+    if (namedParameters.isNotEmpty) jsParams.add(namedArgumentTemp);
+    body.add(js.statement('return super.#(#);', [name, jsParams]));
+    return [new JS.Method(name, new JS.Fun(jsParams, new JS.Block(body)))];
   }
 
   /// Emits a Dart factory constructor to a JS static method.
@@ -1782,10 +1793,8 @@
     if (isUnsupportedFactoryConstructor(node)) return null;
 
     var function = node.function;
-    return new JS.Method(
-        _constructorName(node.name.name),
-        new JS.Fun(
-            _emitFormalParameters(function), _emitFunctionBody(function)),
+    return new JS.Method(_constructorName(node.name.name),
+        new JS.Fun(_emitParameters(function), _emitFunctionBody(function)),
         isStatic: true)
       ..sourceInformation = _nodeEnd(node.fileEndOffset);
   }
@@ -1919,7 +1928,7 @@
         js.call('Symbol.iterator'),
         js.call('function() { return new #.JsIterator(this.#); }', [
           runtimeModule,
-          _emitMemberName('iterator', type: iterable.asInterfaceType)
+          _emitMemberName('iterator', memberClass: coreTypes.iterableClass)
         ]) as JS.Fun);
   }
 
@@ -1929,7 +1938,7 @@
   void _registerExtensionType(
       Class c, String jsPeerName, List<JS.Statement> body) {
     var className = _emitTopLevelName(c);
-    if (isPrimitiveType(c.rawType)) {
+    if (_typeRep.isPrimitive(c.rawType)) {
       body.add(
           runtimeStatement('definePrimitiveHashCode(#.prototype)', className));
     }
@@ -2116,10 +2125,10 @@
   /// helper, that checks for null. The user defined method is called '=='.
   ///
   JS.Expression _emitMemberName(String name,
-      {DartType type,
-      bool isStatic: false,
+      {bool isStatic: false,
       bool useExtension,
-      NamedNode member}) {
+      Member member,
+      Class memberClass}) {
     // Static members skip the rename steps and may require JS interop renames.
     if (isStatic) {
       return _emitStaticMemberName(name, member);
@@ -2146,7 +2155,8 @@
       return emitPrivateNameSymbol(_currentLibrary, name);
     }
 
-    useExtension ??= _isSymbolizedMember(type, name);
+    memberClass ??= member?.enclosingClass;
+    useExtension ??= _isSymbolizedMember(memberClass, name);
     name = JS.memberNameForDartMember(
         name, member is Procedure && member.isExternal);
     if (useExtension) {
@@ -2175,38 +2185,29 @@
   /// Note, this is an underlying assumption here that, if another native type
   /// subtypes this one, it also forwards this member to its underlying native
   /// one without renaming.
-  bool _isSymbolizedMember(DartType type, String name) {
-    while (type is TypeParameterType) {
-      type = (type as TypeParameterType).bound;
-    }
-    if (type == null ||
-        type == const DynamicType() ||
-        type == coreTypes.objectClass) {
+  bool _isSymbolizedMember(Class c, String name) {
+    if (c == null) {
       return isObjectMember(name);
-    } else if (type is InterfaceType) {
-      var c = getImplementationClass(type) ?? type.classNode;
-      if (_extensionTypes.isNativeClass(c)) {
-        var member = _lookupForwardedMember(c, name);
-
-        // Fields on a native class are implicitly native.
-        // Methods/getters/setters are marked external/native.
-        if (member is Field || member is Procedure && member.isExternal) {
-          var jsName = getAnnotationName(member, isJSName);
-          return jsName != null && jsName != name;
-        } else {
-          // Non-external members must be symbolized.
-          return true;
-        }
-      }
-      // If the receiver *may* be a native type (i.e., an interface allowed to
-      // be implemented by a native class), conservatively symbolize - we don't
-      // know whether it'll be implemented via forwarding.
-      // TODO(vsm): Consider CHA here to be less conservative.
-      return _extensionTypes.isNativeInterface(c);
-    } else if (type is FunctionType) {
-      return true;
     }
-    return false;
+    c = _typeRep.getImplementationClass(c.rawType) ?? c;
+    if (_extensionTypes.isNativeClass(c)) {
+      var member = _lookupForwardedMember(c, name);
+
+      // Fields on a native class are implicitly native.
+      // Methods/getters/setters are marked external/native.
+      if (member is Field || member is Procedure && member.isExternal) {
+        var jsName = getAnnotationName(member, isJSName);
+        return jsName != null && jsName != name;
+      } else {
+        // Non-external members must be symbolized.
+        return true;
+      }
+    }
+    // If the receiver *may* be a native type (i.e., an interface allowed to
+    // be implemented by a native class), conservatively symbolize - we don't
+    // know whether it'll be implemented via forwarding.
+    // TODO(vsm): Consider CHA here to be less conservative.
+    return _extensionTypes.isNativeInterface(c);
   }
 
   var _forwardingCache = new HashMap<Class, Map<String, Member>>();
@@ -2640,9 +2641,13 @@
   JS.Fun _emitFunction(FunctionNode f, String name) {
     // normal function (sync), vs (sync*, async, async*)
     var isSync = f.asyncMarker == AsyncMarker.Sync;
-    var formals = _emitFormalParameters(f);
+    var formals = _emitParameters(f);
     var typeFormals = _emitTypeFormals(f.typeParameters);
-    formals.insertAll(0, typeFormals);
+
+    var parent = f.parent;
+    if (_reifyGenericFunction(parent is Member ? parent : null)) {
+      formals.insertAll(0, typeFormals);
+    }
 
     // TODO(jmesserly): need a way of determining if parameters are
     // potentially mutated in Kernel. For now we assume all parameters are.
@@ -2660,9 +2665,14 @@
     return new JS.Fun(formals, code);
   }
 
-  // TODO(jmesserly): rename _emitParameters
-  List<JS.Parameter> _emitFormalParameters(FunctionNode f) {
-    var result = f.positionalParameters.map(_emitVariableDef).toList();
+  List<JS.Parameter> _emitParameters(FunctionNode f) {
+    var positional = f.positionalParameters;
+    var result = new List<JS.Parameter>.from(positional.map(_emitVariableDef));
+    if (positional.isNotEmpty &&
+        f.requiredParameterCount == positional.length &&
+        positional.last.annotations.any(isJsRestAnnotation)) {
+      result.last = new JS.RestParameter(result.last);
+    }
     if (f.namedParameters.isNotEmpty) result.add(namedArgumentTemp);
     return result;
   }
@@ -2736,7 +2746,7 @@
       //
       // In the future, we might be able to simplify this, see:
       // https://github.com/dart-lang/sdk/issues/28320
-      var jsParams = _emitFormalParameters(function);
+      var jsParams = _emitParameters(function);
       var gen = emitGeneratorFn((fnBody) => jsParams =
           jsParams.where(JS.findMutatedVariables(fnBody).contains).toList());
       if (jsParams.isNotEmpty) gen = js.call('() => #(#)', [gen, jsParams]);
@@ -2886,6 +2896,12 @@
   bool _annotatedNullCheck(List<Expression> annotations) =>
       annotations.any(_nullableInference.isNullCheckAnnotation);
 
+  bool _reifyGenericFunction(Member m) =>
+      m == null ||
+      m.enclosingLibrary.importUri.scheme != 'dart' ||
+      !m.annotations
+          .any((a) => isBuiltinAnnotation(a, '_js_helper', 'NoReifyGeneric'));
+
   JS.Statement _nullParameterCheck(JS.Expression param) {
     var call = runtimeCall('argumentError((#))', [param]);
     return js.statement('if (# == null) #;', [param, call]);
@@ -3634,32 +3650,36 @@
   JS.Expression _emitPropertyGet(Expression receiver, Member member,
       [String memberName]) {
     memberName ??= member.name.name;
-    var receiverType = receiver.getStaticType(types);
     // TODO(jmesserly): should tearoff of `.call` on a function type be
     // encoded as a different node, or possibly eliminated?
     // (Regardless, we'll still need to handle the callable JS interop classes.)
-    if (memberName == 'call' && _isDirectCallable(receiverType)) {
+    if (memberName == 'call' &&
+        _isDirectCallable(receiver.getStaticType(types))) {
       // Tearoff of `call` on a function type is a no-op;
       return _visitExpression(receiver);
     }
-    var jsName =
-        _emitMemberName(memberName, type: receiverType, member: member);
+    var jsName = _emitMemberName(memberName, member: member);
     var jsReceiver = _visitExpression(receiver);
 
     // TODO(jmesserly): we need to mark an end span for property accessors so
     // they can be hovered. Unfortunately this is not possible as Kernel does
     // not store this data.
-    if (member == null) {
+    if (isObjectMember(memberName)) {
+      if (isNullable(receiver)) {
+        // If the receiver is nullable, use a helper so calls like
+        // `null.hashCode` and `null.runtimeType` will work.
+        // Also method tearoffs like `null.toString`.
+        if (_isObjectMethod(memberName)) {
+          return runtimeCall('bind(#, #)', [jsReceiver, jsName]);
+        }
+        return runtimeCall('#(#)', [memberName, jsReceiver]);
+      }
+      // Otherwise generate this as a normal typed property get.
+    } else if (member == null) {
       return runtimeCall('dload$_replSuffix(#, #)', [jsReceiver, jsName]);
     }
 
-    if (_isObjectMemberCall(receiver, memberName)) {
-      if (_isObjectMethod(memberName)) {
-        return runtimeCall('bind(#, #)', [jsReceiver, jsName]);
-      } else {
-        return runtimeCall('#(#)', [memberName, jsReceiver]);
-      }
-    } else if (_reifyTearoff(member)) {
+    if (_reifyTearoff(member)) {
       return runtimeCall('bind(#, #)', [jsReceiver, jsName]);
     } else {
       return new JS.PropertyAccess(jsReceiver, jsName);
@@ -3674,8 +3694,8 @@
   JS.Expression _emitPropertySet(
       Expression receiver, Member member, Expression value,
       [String memberName]) {
-    var jsName = _emitMemberName(memberName ?? member.name.name,
-        type: receiver.getStaticType(types), member: member);
+    var jsName =
+        _emitMemberName(memberName ?? member.name.name, member: member);
 
     var jsReceiver = _visitExpression(receiver);
     var jsValue = _visitExpression(value);
@@ -3754,13 +3774,13 @@
     }
 
     var jsReceiver = _visitExpression(receiver);
-    var args = _emitArgumentList(arguments);
-    var receiverType = receiver.getStaticType(types);
+    var args = _emitArgumentList(arguments, target: target);
 
     bool isCallingDynamicField = target is Member &&
         target.hasGetter &&
         _isDynamicOrFunction(target.getterType);
     if (name == 'call') {
+      var receiverType = receiver.getStaticType(types);
       if (isCallingDynamicField || _isDynamicOrFunction(receiverType)) {
         return _emitDynamicInvoke(jsReceiver, null, args, arguments);
       } else if (_isDirectCallable(receiverType)) {
@@ -3769,13 +3789,17 @@
       }
     }
 
-    var jsName = _emitMemberName(name, type: receiverType, member: target);
-    if (target == null || isCallingDynamicField) {
-      return _emitDynamicInvoke(jsReceiver, jsName, args, arguments);
-    }
-    if (_isObjectMemberCall(receiver, name)) {
+    var jsName = _emitMemberName(name, member: target);
+    if (isObjectMember(name)) {
       assert(arguments.types.isEmpty); // Object methods don't take type args.
-      return runtimeCall('#(#, #)', [name, jsReceiver, args]);
+      if (isNullable(receiver)) {
+        // If the receiver is nullable, use a helper so calls like
+        // `null.toString()` will work.
+        return runtimeCall('#(#, #)', [name, jsReceiver, args]);
+      }
+      // Otherwise generate this as a normal typed method call.
+    } else if (target == null || isCallingDynamicField) {
+      return _emitDynamicInvoke(jsReceiver, jsName, args, arguments);
     }
     // TODO(jmesserly): remove when Kernel desugars this for us.
     // Handle `o.m(a)` where `o.m` is a getter returning a class with `call`.
@@ -3833,7 +3857,7 @@
     var c = from.classNode;
     var member = hierarchy.getInterfaceMember(c, new Name("call"));
     if (member is Procedure && !member.isAccessor && !usesJSInterop(c)) {
-      return _emitMemberName('call', type: from, member: member);
+      return _emitMemberName('call', member: member);
     }
     return null;
   }
@@ -3844,19 +3868,20 @@
   JS.Expression _emitUnaryOperator(
       Expression expr, Member target, InvocationExpression node) {
     var op = node.name.name;
-    var dispatchType = expr.getStaticType(types);
-    if (_typeRep.unaryOperationIsPrimitive(dispatchType)) {
-      if (op == '~') {
-        if (_typeRep.isNumber(dispatchType)) {
-          return _coerceBitOperationResultToUnsigned(
-              node, js.call('~#', notNull(expr)));
+    if (target != null) {
+      var dispatchType = target.enclosingClass.rawType;
+      if (_typeRep.unaryOperationIsPrimitive(dispatchType)) {
+        if (op == '~') {
+          if (_typeRep.isNumber(dispatchType)) {
+            return _coerceBitOperationResultToUnsigned(
+                node, js.call('~#', notNull(expr)));
+          }
+          return _emitOperatorCall(expr, target, op, []);
         }
-        return _emitOperatorCall(expr, target, op, []);
+        if (op == 'unary-') op = '-';
+        return js.call('$op#', notNull(expr));
       }
-      if (op == 'unary-') op = '-';
-      return js.call('$op#', notNull(expr));
     }
-
     return _emitOperatorCall(expr, target, op, []);
   }
 
@@ -4010,76 +4035,82 @@
     var op = node.name.name;
     if (op == '==') return _emitEqualityOperator(left, target, right);
 
-    var leftType = left.getStaticType(types);
-    var rightType = right.getStaticType(types);
+    // TODO(jmesserly): using the target type here to work around:
+    // https://github.com/dart-lang/sdk/issues/33293
+    if (target != null) {
+      var targetClass = target.enclosingClass;
+      var leftType = targetClass.rawType;
+      var rightType = right.getStaticType(types);
 
-    if (_typeRep.binaryOperationIsPrimitive(leftType, rightType) ||
-        leftType == types.stringType && op == '+') {
-      // special cases where we inline the operation
-      // these values are assumed to be non-null (determined by the checker)
-      // TODO(jmesserly): it would be nice to just inline the method from core,
-      // instead of special cases here.
-      JS.Expression binary(String code) {
-        return js.call(code, [notNull(left), notNull(right)]);
-      }
+      if (_typeRep.binaryOperationIsPrimitive(leftType, rightType) ||
+          leftType == types.stringType && op == '+') {
+        // special cases where we inline the operation
+        // these values are assumed to be non-null (determined by the checker)
+        // TODO(jmesserly): it would be nice to just inline the method from core,
+        // instead of special cases here.
+        JS.Expression binary(String code) {
+          return js.call(code, [notNull(left), notNull(right)]);
+        }
 
-      JS.Expression bitwise(String code) {
-        return _coerceBitOperationResultToUnsigned(node, binary(code));
-      }
+        JS.Expression bitwise(String code) {
+          return _coerceBitOperationResultToUnsigned(node, binary(code));
+        }
 
-      switch (op) {
-        case '~/':
-          // `a ~/ b` is equivalent to `(a / b).truncate()`
-          return js.call('(# / #).#()', [
-            notNull(left),
-            notNull(right),
-            _emitMemberName('truncate', type: leftType)
-          ]);
+        switch (op) {
+          case '~/':
+            // `a ~/ b` is equivalent to `(a / b).truncate()`
+            return js.call('(# / #).#()', [
+              notNull(left),
+              notNull(right),
+              _emitMemberName('truncate', memberClass: targetClass)
+            ]);
 
-        case '%':
-          // TODO(sra): We can generate `a % b + 0` if both are non-negative
-          // (the `+ 0` is to coerce -0.0 to 0).
-          return _emitOperatorCall(left, target, op, [right]);
+          case '%':
+            // TODO(sra): We can generate `a % b + 0` if both are non-negative
+            // (the `+ 0` is to coerce -0.0 to 0).
+            return _emitOperatorCall(left, target, op, [right]);
 
-        case '&':
-          return bitwise('# & #');
+          case '&':
+            return bitwise('# & #');
 
-        case '|':
-          return bitwise('# | #');
+          case '|':
+            return bitwise('# | #');
 
-        case '^':
-          return bitwise('# ^ #');
+          case '^':
+            return bitwise('# ^ #');
 
-        case '>>':
-          int shiftCount = _asIntInRange(right, 0, 31);
-          if (_is31BitUnsigned(left) && shiftCount != null) {
-            return binary('# >> #');
-          }
-          if (_isDefinitelyNonNegative(left) && shiftCount != null) {
-            return binary('# >>> #');
-          }
-          // If the context selects out only bits that can't be affected by the
-          // sign position we can use any JavaScript shift, `(x >> 6) & 3`.
-          if (shiftCount != null &&
-              _parentMasksToWidth(node, 31 - shiftCount)) {
-            return binary('# >> #');
-          }
-          return _emitOperatorCall(left, target, op, [right]);
+          case '>>':
+            int shiftCount = _asIntInRange(right, 0, 31);
+            if (_is31BitUnsigned(left) && shiftCount != null) {
+              return binary('# >> #');
+            }
+            if (_isDefinitelyNonNegative(left) && shiftCount != null) {
+              return binary('# >>> #');
+            }
+            // If the context selects out only bits that can't be affected by the
+            // sign position we can use any JavaScript shift, `(x >> 6) & 3`.
+            if (shiftCount != null &&
+                _parentMasksToWidth(node, 31 - shiftCount)) {
+              return binary('# >> #');
+            }
+            return _emitOperatorCall(left, target, op, [right]);
 
-        case '<<':
-          if (_is31BitUnsigned(node)) {
-            // Result is 31 bit unsigned which implies the shift count was small
-            // enough not to pollute the sign bit.
-            return binary('# << #');
-          }
-          if (_asIntInRange(right, 0, 31) != null) {
-            return _coerceBitOperationResultToUnsigned(node, binary('# << #'));
-          }
-          return _emitOperatorCall(left, target, op, [right]);
+          case '<<':
+            if (_is31BitUnsigned(node)) {
+              // Result is 31 bit unsigned which implies the shift count was small
+              // enough not to pollute the sign bit.
+              return binary('# << #');
+            }
+            if (_asIntInRange(right, 0, 31) != null) {
+              return _coerceBitOperationResultToUnsigned(
+                  node, binary('# << #'));
+            }
+            return _emitOperatorCall(left, target, op, [right]);
 
-        default:
-          // TODO(vsm): When do Dart ops not map to JS?
-          return binary('# $op #');
+          default:
+            // TODO(vsm): When do Dart ops not map to JS?
+            return binary('# $op #');
+        }
       }
     }
 
@@ -4089,7 +4120,8 @@
   JS.Expression _emitEqualityOperator(
       Expression left, Member target, Expression right,
       {bool negated = false}) {
-    var leftType = left.getStaticType(types);
+    var targetClass = target?.enclosingClass;
+    var leftType = targetClass?.rawType ?? left.getStaticType(types);
 
     // Conceptually `x == y` in Dart is defined as:
     //
@@ -4107,14 +4139,15 @@
     // TODO(leafp,jmesserly): we could use class hierarchy analysis to check
     // if `operator ==` was overridden, similar to how we devirtualize private
     // fields.
+    //
+    // If we know that the left type uses identity for equality, we can
+    // sometimes emit better code, either `===` or `==`.
     var isEnum = leftType is InterfaceType && leftType.classNode.isEnum;
     var usesIdentity = _typeRep.isPrimitive(leftType) ||
         isEnum ||
         _isNull(left) ||
         _isNull(right);
 
-    // If we know that the left type uses identity for equality, we can
-    // sometimes emit better code, either `===` or `==`.
     if (usesIdentity) {
       return _emitCoreIdenticalCall([left, right], negated: negated);
     }
@@ -4131,7 +4164,7 @@
     // Otherwise we emit a call to the == method.
     return js.call(negated ? '!#[#](#)' : '#[#](#)', [
       _visitExpression(left),
-      _emitMemberName('==', type: leftType),
+      _emitMemberName('==', memberClass: targetClass),
       _visitExpression(right)
     ]);
   }
@@ -4145,8 +4178,7 @@
       Expression receiver, Member target, String name, List<Expression> args) {
     // TODO(jmesserly): calls that don't pass `element` are probably broken for
     // `super` calls from disallowed super locations.
-    var type = receiver.getStaticType(types);
-    var memberName = _emitMemberName(name, type: type, member: target);
+    var memberName = _emitMemberName(name, member: target);
     if (target == null) {
       // dynamic dispatch
       var dynamicHelper = const {'[]': 'dindex', '[]=': 'dsetindex'}[name];
@@ -4170,15 +4202,15 @@
   // TODO(jmesserly): optimize super operators for kernel
   @override
   visitSuperMethodInvocation(SuperMethodInvocation node) {
-    return new JS.Call(_emitSuperTarget(node.interfaceTarget),
-        _emitArgumentList(node.arguments));
+    var target = node.interfaceTarget;
+    return new JS.Call(_emitSuperTarget(target),
+        _emitArgumentList(node.arguments, target: target));
   }
 
   /// Emits the [JS.PropertyAccess] for accessors or method calls to
   /// [jsTarget].[jsName], replacing `super` if it is not allowed in scope.
   JS.PropertyAccess _emitSuperTarget(Member member, {bool setter: false}) {
-    var type = member.enclosingClass.rawType;
-    var jsName = _emitMemberName(member.name.name, type: type, member: member);
+    var jsName = _emitMemberName(member.name.name, member: member);
     if (member is Field && !virtualFields.isVirtual(member)) {
       return new JS.PropertyAccess(new JS.This(), jsName);
     }
@@ -4252,7 +4284,7 @@
     }
 
     var fn = _emitStaticTarget(target);
-    var args = _emitArgumentList(node.arguments);
+    var args = _emitArgumentList(node.arguments, target: target);
     return new JS.Call(fn, args);
   }
 
@@ -4302,13 +4334,25 @@
   JS.Expression _emitStaticTarget(Member target) {
     var c = target.enclosingClass;
     if (c != null) {
+      // A static native element should just forward directly to the
+      // JS type's member.
+      if (target is Procedure && target.isStatic && target.isExternal) {
+        var nativeName = _extensionTypes.getNativePeers(c);
+        if (nativeName.isNotEmpty) {
+          var memberName = getAnnotationName(target, isJSName) ??
+              _emitStaticMemberName(target.name.name, target);
+          return runtimeCall('global.#.#', [nativeName[0], memberName]);
+        }
+      }
       return new JS.PropertyAccess(_emitStaticClassName(c),
           _emitStaticMemberName(target.name.name, target));
     }
     return _emitTopLevelName(target);
   }
 
-  List<JS.Expression> _emitArgumentList(Arguments node, {bool types: true}) {
+  List<JS.Expression> _emitArgumentList(Arguments node,
+      {bool types: true, Member target}) {
+    types = types && _reifyGenericFunction(target);
     var args = <JS.Expression>[];
     if (types) {
       for (var typeArg in node.types) {
@@ -4410,8 +4454,6 @@
   /// [_notNullLocals].
   bool isNullable(Expression expr) => _nullableInference.isNullable(expr);
 
-  bool isPrimitiveType(DartType t) => _typeRep.isPrimitive(t);
-
   JS.Expression _emitJSDoubleEq(List<JS.Expression> args,
       {bool negated = false}) {
     var op = negated ? '# != #' : '# == #';
@@ -4525,7 +4567,7 @@
   JS.Expression _emitMapImplType(InterfaceType type, {bool identity}) {
     var typeArgs = type.typeArguments;
     if (typeArgs.isEmpty) return _emitType(type);
-    identity ??= isPrimitiveType(typeArgs[0]);
+    identity ??= _typeRep.isPrimitive(typeArgs[0]);
     var c = identity ? identityHashMapImplClass : linkedHashMapImplClass;
     return _emitType(new InterfaceType(c, typeArgs));
   }
@@ -4533,13 +4575,13 @@
   JS.Expression _emitSetImplType(InterfaceType type, {bool identity}) {
     var typeArgs = type.typeArguments;
     if (typeArgs.isEmpty) return _emitType(type);
-    identity ??= isPrimitiveType(typeArgs[0]);
+    identity ??= _typeRep.isPrimitive(typeArgs[0]);
     var c = identity ? identityHashSetImplClass : linkedHashSetImplClass;
     return _emitType(new InterfaceType(c, typeArgs));
   }
 
   JS.Expression _emitObjectLiteral(Arguments node) {
-    var args = _emitArgumentList(node);
+    var args = _emitArgumentList(node, types: false);
     if (args.isEmpty) return js.call('{}');
     assert(args.single is JS.ObjectInitializer);
     return args.single;
@@ -4586,37 +4628,18 @@
 
   @override
   visitStringConcatenation(StringConcatenation node) {
-    var expressions = node.expressions;
-    if (expressions.every((e) => e is StringLiteral)) {
-      return new JS.Expression.binary(_visitExpressionList(expressions), '+');
-    }
-
-    var strings = <String>[];
-    var interpolations = <JS.Expression>[];
-
-    var expectString = true;
-    for (var e in expressions) {
-      if (e is StringLiteral) {
-        // Escape the string as necessary for use in the eventual `` quotes.
-        // TODO(jmesserly): this call adds quotes, and then we strip them off.
-        var str = js.escapedString(e.value, '`').value;
-        str = str.substring(1, str.length - 1);
-        if (expectString) {
-          strings.add(str);
-        } else {
-          var last = strings.length - 1;
-          strings[last] = strings[last] + str;
-        }
-        expectString = false;
-      } else {
-        if (expectString) strings.add('');
-        interpolations.add(_visitExpression(e));
-        expectString = true;
+    var parts = <JS.Expression>[];
+    for (var e in node.expressions) {
+      var jsExpr = _visitExpression(e);
+      if (jsExpr is JS.LiteralString && jsExpr.valueWithoutQuotes.isEmpty) {
+        continue;
       }
+      parts.add(e.getStaticType(types) == types.stringType && !isNullable(e)
+          ? jsExpr
+          : runtimeCall('str(#)', jsExpr));
     }
-    if (expectString) strings.add('');
-    return new JS.TaggedTemplate(
-        runtimeCall('str'), new JS.TemplateString(strings, interpolations));
+    if (parts.isEmpty) return js.string('');
+    return new JS.Expression.binary(parts, '+');
   }
 
   @override
@@ -4625,7 +4648,7 @@
     JS.Expression result;
     var type = node.type;
     var lhs = _visitExpression(node.operand);
-    var typeofName = _jsTypeofName(type);
+    var typeofName = _typeRep.typeFor(type).primitiveTypeOf;
     // Inline primitives other than int (which requires a Math.floor check).
     if (typeofName != null && type != coreTypes.intClass.rawType) {
       result = js.call('typeof # == #', [lhs, js.string(typeofName, "'")]);
@@ -4637,22 +4660,6 @@
     return result;
   }
 
-  String _jsTypeofName(DartType type) {
-    var t = _typeRep.typeFor(type);
-    if (t is JSNumber) return 'number';
-    if (t is JSString) return 'string';
-    if (t is JSBoolean) return 'boolean';
-    return null;
-  }
-
-  Class getImplementationClass(DartType type) {
-    var t = _typeRep.typeFor(type);
-    if (t is JSNumber) return _jsNumberClass;
-    if (t is JSString) return _jsStringClass;
-    if (t is JSBoolean) return _jsBoolClass;
-    return null;
-  }
-
   @override
   visitAsExpression(AsExpression node) {
     Expression fromExpr = node.operand;
@@ -4720,8 +4727,10 @@
           nativeSymbol
         ]);
       } else {
-        return js.call('#.new(#)',
-            [_emitConstructorAccess(coreTypes.symbolClass.rawType), name]);
+        return js.call('new #.new(#)', [
+          _emitConstructorAccess(coreTypes.internalSymbolClass.rawType),
+          name
+        ]);
       }
     }
 
@@ -4957,16 +4966,6 @@
         _reifyFunctionType(member.function);
   }
 
-  /// Everything in Dart is an Object and supports the 4 members on Object,
-  /// so we have to use a runtime helper to handle values such as `null` and
-  /// native types.
-  ///
-  /// For example `null.toString()` is legal in Dart, so we need to generate
-  /// that as `dart.toString(obj)`.
-  bool _isObjectMemberCall(Expression target, String memberName) {
-    return isObjectMember(memberName) && isNullable(target);
-  }
-
   /// Returns the name value of the `JSExportName` annotation (when compiling
   /// the SDK), or `null` if there's none. This is used to control the name
   /// under which functions are compiled and exported.
diff --git a/pkg/dev_compiler/lib/src/kernel/js_typerep.dart b/pkg/dev_compiler/lib/src/kernel/js_typerep.dart
index 103e981..b43b1b0 100644
--- a/pkg/dev_compiler/lib/src/kernel/js_typerep.dart
+++ b/pkg/dev_compiler/lib/src/kernel/js_typerep.dart
@@ -5,87 +5,9 @@
 import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart';
 import 'package:kernel/type_environment.dart';
+import '../compiler/js_typerep.dart';
 
-/// An abstraction of the JS types
-abstract class JSType {
-  const JSType();
-
-  /// True if this type is built-in to JS, and we use the values unwrapped.
-  /// For these types we generate a calling convention via static
-  /// "extension methods". This allows types to be extended without adding
-  /// extensions directly on the prototype.
-  bool get isPrimitive;
-
-  /// Is this type known to be definitively primitive
-  /// (using the JS notion of primitive)
-  bool get isPrimitiveInJS;
-
-  /// Can a non-null element of this type potentially be interpreted
-  /// as false in JS.
-  bool get isFalsey;
-
-  static const jsBoolean = const JSBoolean();
-  static const jsNumber = const JSNumber();
-  static const jsNull = const JSNull();
-  static const jsObject = const JSObject();
-  static const jsString = const JSString();
-  static const jsUnknown = const JSUnknown();
-}
-
-/// Inhabited by booleans (including JSBool), null, and undefined
-class JSBoolean extends JSType {
-  const JSBoolean();
-  bool get isPrimitive => true;
-  bool get isPrimitiveInJS => true;
-  bool get isFalsey => true;
-}
-
-/// Inhabited by numbers, null, and undefined
-/// In practice, this is 4 types: num, int, double, and _interceptors.JSNumber.
-///
-/// _interceptors.JSNumber is the type that actually "implements" all numbers,
-/// hence it's a subtype of int and double (and num).
-/// It's defined in our "dart:_interceptors".
-class JSNumber extends JSType {
-  const JSNumber();
-  bool get isPrimitive => true;
-  bool get isPrimitiveInJS => true;
-  bool get isFalsey => true;
-}
-
-/// Inhabited by null and undefined
-class JSNull extends JSType {
-  const JSNull();
-  bool get isPrimitive => false;
-  bool get isPrimitiveInJS => false;
-  bool get isFalsey => true;
-}
-
-/// Inhabited by objects, null, and undefined
-class JSObject extends JSType {
-  const JSObject();
-  bool get isPrimitive => false;
-  bool get isPrimitiveInJS => false;
-  bool get isFalsey => false;
-}
-
-/// Inhabited by strings (including JSString), null, and undefined
-class JSString extends JSType {
-  const JSString();
-  bool get isPrimitive => true;
-  bool get isPrimitiveInJS => false;
-  bool get isFalsey => true;
-}
-
-/// Inhabitance not statically known
-class JSUnknown extends JSType {
-  const JSUnknown();
-  bool get isPrimitive => false;
-  bool get isPrimitiveInJS => false;
-  bool get isFalsey => true;
-}
-
-class JSTypeRep {
+class JSTypeRep extends SharedJSTypeRep<DartType> {
   final TypeEnvironment types;
   final CoreTypes coreTypes;
 
@@ -102,6 +24,7 @@
         _jsString =
             types.coreTypes.index.getClass('dart:_interceptors', 'JSString');
 
+  @override
   JSType typeFor(DartType type) {
     while (type is TypeParameterType) {
       type = (type as TypeParameterType).parameter.bound;
@@ -148,42 +71,4 @@
     if (rep == JSType.jsString) return _jsString;
     return null;
   }
-
-  /// If the type [t] is [int] or [double], or a type parameter
-  /// bounded by [int], [double] or [num] returns [num].
-  /// Otherwise returns [t].
-  DartType canonicalizeNumTypes(DartType t) =>
-      isNumber(t) ? coreTypes.nullClass.rawType : t;
-
-  bool isNumber(DartType type) => typeFor(type) is JSNumber;
-
-  /// Is this type known to be represented as Object or Null in JS.
-  bool isObjectOrNull(DartType t) {
-    var rep = typeFor(t);
-    return rep is JSObject || rep is JSNull;
-  }
-
-  bool isUnknown(DartType t) => typeFor(t) is JSUnknown;
-
-  bool isPrimitive(DartType t) => typeFor(t).isPrimitive;
-
-  bool isPrimitiveInJS(DartType t) => typeFor(t).isPrimitiveInJS;
-
-  bool binaryOperationIsPrimitive(DartType leftT, DartType rightT) =>
-      isPrimitiveInJS(leftT) && isPrimitiveInJS(rightT);
-
-  bool unaryOperationIsPrimitive(DartType t) => isPrimitiveInJS(t);
-
-  /// True if the JS double equals (`==`) comparison on the representation
-  /// of these two types could potentially cause a conversion.
-  bool equalityMayConvert(DartType t0, DartType t1) => !equalOrNull(t0, t1);
-
-  // Are t0 and t1 known to either be represented by the same type
-  // or else one or both of them is represented by Null
-  bool equalOrNull(DartType t0, DartType t1) {
-    var rep0 = typeFor(t0);
-    var rep1 = typeFor(t1);
-    if (rep0 is JSNull || rep1 is JSNull) return true;
-    return rep0 == rep1 && rep0 is! JSUnknown;
-  }
 }
diff --git a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
index 44a8f0f..b9b6412 100644
--- a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
+++ b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
@@ -83,8 +83,10 @@
     Expression value, String libraryName, String expectedName) {
   if (value is ConstructorInvocation) {
     var c = value.target.enclosingClass;
-    return c.name == expectedName &&
-        c.enclosingLibrary.importUri.toString() == libraryName;
+    if (c.name == expectedName) {
+      var uri = c.enclosingLibrary.importUri;
+      return uri.scheme == 'dart' && uri.path == libraryName;
+    }
   }
   return false;
 }
diff --git a/pkg/dev_compiler/lib/src/kernel/native_types.dart b/pkg/dev_compiler/lib/src/kernel/native_types.dart
index 78876b4..cde8c08 100644
--- a/pkg/dev_compiler/lib/src/kernel/native_types.dart
+++ b/pkg/dev_compiler/lib/src/kernel/native_types.dart
@@ -83,7 +83,7 @@
   void _addExtensionTypesForLibrary(String library, List<String> classNames) {
     var sdk = coreTypes.index;
     for (var className in classNames) {
-      _addExtensionType(sdk.getClass(library, className), true);
+      _addExtensionType(sdk.getClass(library, className));
     }
   }
 
diff --git a/pkg/dev_compiler/lib/src/kernel/property_model.dart b/pkg/dev_compiler/lib/src/kernel/property_model.dart
index e630821..1edc3b7 100644
--- a/pkg/dev_compiler/lib/src/kernel/property_model.dart
+++ b/pkg/dev_compiler/lib/src/kernel/property_model.dart
@@ -310,13 +310,13 @@
   ///
   /// By tracking the set of seen members, we can visit superclasses and mixins
   /// and ultimately collect every most-derived member exposed by a given type.
-  void _findExtensionMembers(Class class_, HashSet<String> seenConcreteMembers,
-      Set<String> allNatives) {
+  void _findExtensionMembers(
+      Class c, HashSet<String> seenConcreteMembers, Set<String> allNatives) {
     // We only visit each most derived concrete member.
     // To avoid visiting an overridden superclass member, we skip members
     // we've seen, and visit starting from the class, then mixins in
     // reverse order, then superclasses.
-    for (var m in class_.members) {
+    for (var m in c.members) {
       var name = m.name.name;
       if (m.isAbstract || m is Constructor) continue;
       if (m is Procedure) {
@@ -338,8 +338,11 @@
   /// types.
   void _collectNativeMembers(Class c, Set<String> members) {
     if (extensionTypes.hasNativeSubtype(c)) {
-      for (var m in c.procedures) {
-        if (!m.name.isPrivate && !m.isStatic) members.add(m.name.name);
+      for (var m in c.members) {
+        if (!m.name.isPrivate &&
+            (m is Procedure && !m.isStatic || m is Field && !m.isStatic)) {
+          members.add(m.name.name);
+        }
       }
     }
     var m = c.mixedInClass;
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 26dbc21..5996ea5 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -77,9 +77,15 @@
     // to the file where the class resides, or the file where the method we're
     // mocking resides).
     Expression createInvocation(String name, List<Expression> positional) {
-      var ctor = coreTypes.invocationClass.procedures
+      // TODO(jmesserly): this uses the implementation _Invocation class,
+      // because the CFE does not resolve the redirecting factory constructors
+      // like it would for user code. Our code generator expects all redirecting
+      // factories to be resolved to the real constructor.
+      var ctor = coreTypes.index
+          .getClass('dart:core', '_Invocation')
+          .constructors
           .firstWhere((c) => c.name.name == name);
-      return new StaticInvocation(ctor, new Arguments(positional));
+      return new ConstructorInvocation(ctor, new Arguments(positional));
     }
 
     if (name.startsWith('get:')) {
@@ -96,6 +102,8 @@
     if (isGeneric) {
       ctorArgs.add(new ListLiteral(
           arguments.types.map((t) => new TypeLiteral(t)).toList()));
+    } else {
+      ctorArgs.add(new NullLiteral());
     }
     ctorArgs.add(new ListLiteral(arguments.positional));
     if (arguments.named.isNotEmpty) {
@@ -105,7 +113,7 @@
               .toList(),
           keyType: coreTypes.symbolClass.rawType));
     }
-    return createInvocation(isGeneric ? 'genericMethod' : 'method', ctorArgs);
+    return createInvocation('method', ctorArgs);
   }
 
   @override
diff --git a/pkg/dev_compiler/test/browser/language_tests.js b/pkg/dev_compiler/test/browser/language_tests.js
deleted file mode 100644
index 0d33cb0..0000000
--- a/pkg/dev_compiler/test/browser/language_tests.js
+++ /dev/null
@@ -1,796 +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.
-
-define(['dart_sdk', 'async_helper', 'expect', 'unittest', 'is', 'require',
-        'test_status'],
-      function(dart_sdk, async_helper, expect, unittest, is, require,
-               test_status) {
-  'use strict';
-
-  async_helper = async_helper.async_helper;
-  let minitest = expect.minitest;
-  let mochaOnError = window.onerror;
-  dart_sdk.dart.trapRuntimeErrors(false);
-  dart_sdk.dart.ignoreWhitelistedErrors(false);
-  dart_sdk._isolate_helper.startRootIsolate(function() {}, []);
-  // Make it easier to debug test failures and required for formatter test that
-  // assumes custom formatters are enabled.
-  dart_sdk._debugger.registerDevtoolsFormatter();
-
-  let html_config = unittest.html_config;
-  // Test attributes are a list of strings, or a string for a single
-  // attribute. Valid attributes are:
-  //
-  //   'pass' - test passes (default)
-  //   'skip' - don't run the test
-  //   'fail' - test fails
-  //   'timeout' - test times out
-  //   'slow' - use 5s timeout instead of default 2s.
-  //
-  // Common combinations:
-  const pass = 'pass';
-  const fail = 'fail';
-  const skip_timeout = ['skip', 'timeout'];
-
-  // Browsers
-  const firefox_fail = is.firefox() ? fail : pass;
-  const chrome_fail = is.chrome() ? fail : pass;
-
-  // These are typically tests with asynchronous exceptions that our
-  // test framework doesn't always catch.
-  const flaky = 'skip';
-
-  // Tests marked with this are still using the deprecated unittest package
-  // because they rely on its support for futures and asynchronous tests, which
-  // expect and minitest do not handle.
-  // TODO(rnystrom): Move all of these away from using the async test API so
-  // they can stop using unittest.
-  const async_unittest = ['skip', 'fail'];
-
-  // The number of expected unittest errors should be zero but unfortunately
-  // there are a lot of broken html unittests.
-  let num_expected_unittest_fails = 4;
-  let num_expected_unittest_errors = 0;
-
-  // TODO(jmesserly): separate StrongModeError from other errors.
-  let all_status = {
-    'language': {
-      // Flaky on travis (https://github.com/dart-lang/sdk/issues/27224)
-      'async_await_test_03_multi': async_unittest,
-
-      'async_star_pause_test': fail,
-      'async_star_await_pauses_test': skip_timeout,
-
-      // TODO(jmesserly): figure out why this test is hanging.
-      'async_star_cancel_and_throw_in_finally_test': skip_timeout,
-
-      'async_star_cancel_while_paused_test': fail,
-
-      // TODO(vsm): Re-enable (https://github.com/dart-lang/sdk/issues/28319)
-      'async_star_test_none_multi': async_unittest,
-      'async_star_test_01_multi': async_unittest,
-      'async_star_test_02_multi': async_unittest,
-      'async_star_test_03_multi': async_unittest,
-      'async_star_test_04_multi': async_unittest,
-      'async_star_test_05_multi': async_unittest,
-
-      'async_switch_test': fail,
-      'asyncstar_throw_in_catch_test': ['skip', 'fail'],
-      'await_future_test': skip_timeout,
-      'await_for_test': 'slow',
-      'bit_operations_test_none_multi': fail,  // DDC/dart2js canonicalize bitop results to unsigned
-      'branch_canonicalization_test': fail,  // JS bit operations truncate to 32 bits.
-      'call_test': fail,
-      'call_closurization_test': fail, // Functions do not expose a "call" method.
-      'call_test': fail,
-      'canonical_const2_test': fail,
-      'canonical_const_test': fail,
-      'compile_time_constant10_test_none_multi': fail,
-      'compile_time_constant_a_test': fail,
-      'compile_time_constant_b_test': fail,
-      'compile_time_constant_d_test': fail,
-      'compile_time_constant_k_test_none_multi': fail,
-      'compile_time_constant_o_test_none_multi': fail,
-      'const_evaluation_test_01_multi': fail,
-      'const_switch_test_02_multi': fail,
-      'const_switch_test_04_multi': fail,
-      'constructor12_test': fail,
-      'covariant_subtyping_with_substitution_test': fail,
-      'custom_await_stack_trace_test': fail,
-      'cyclic_type2_test': fail,
-      'cyclic_type_test_02_multi': fail,
-      'cyclic_type_test_03_multi': fail,
-      'cyclic_type_test_04_multi': fail,
-
-      // Deferred libraries are not actually deferred. These tests all test
-      // that synchronous access to the library fails.
-      'deferred_call_empty_before_load_test': fail,
-      'deferred_load_library_wrong_args_test_01_multi': fail,
-      'deferred_not_loaded_check_test': fail,
-      'deferred_redirecting_factory_test': fail,
-      'deferred_static_seperate_test': fail,
-
-      'double_int_to_string_test': fail,
-      'dynamic_test': fail,
-      'exception_test': fail,
-      'execute_finally6_test': fail,
-      'expect_test': fail,
-      'extends_test_lib': fail,
-      'f_bounded_quantification3_test': fail,
-      'field_increment_bailout_test': fail,
-      'field_optimization3_test': fail,
-      'first_class_types_test': fail,
-      'flatten_test_01_multi': fail,
-      'flatten_test_04_multi': fail,
-      'flatten_test_05_multi': fail,
-      'flatten_test_08_multi': fail,
-      'flatten_test_09_multi': fail,
-      'flatten_test_12_multi': fail,
-      'for_variable_capture_test': is.firefox('<=50') ? pass : fail,
-      'function_subtype_inline2_test': fail,
-      'function_subtype_named1_test': fail,
-      'function_subtype_named2_test': fail,
-      'function_subtype_optional1_test': fail,
-      'function_subtype_optional2_test': fail,
-      'function_subtype_typearg2_test': fail,
-      'function_subtype_typearg4_test': fail,
-      'function_type_alias6_test_none_multi': fail,
-      'generic_instanceof_test': fail, // runtime strong mode reject
-      'generic_instanceof2_test': fail,
-      'generic_is_check_test': fail,
-      'getter_closure_execution_order_test': fail,
-      'gc_test': 'slow',
-      'identical_closure2_test': fail,
-      'infinite_switch_label_test': fail,
-      'infinity_test': fail,
-      'initializing_formal_final_test': fail,
-      'instance_creation_in_function_annotation_test': fail,
-      'instanceof2_test': fail,
-      'instanceof4_test_01_multi': fail,
-      'instanceof4_test_none_multi': fail,
-      'integer_division_by_zero_test': fail,
-      'issue23244_test': fail,
-      'invocation_mirror_test': fail, // dcall does not correctly detect named arguments
-      'invocation_mirror2_test': fail, // JsInstanceMirror.delegate unimplemented
-      'lazy_static3_test': fail,
-      'least_upper_bound_expansive_test_none_multi': fail,
-      'left_shift_test': fail,
-      'list_is_test': fail,
-      'list_literal3_test': fail,
-      'main_test_03_multi': fail,
-      'many_generic_instanceof_test': fail,
-      'map_literal10_test': fail,
-      'map_literal7_test': fail,
-      'memory_swap_test': skip_timeout,
-      'mint_arithmetic_test': fail,
-      'modulo_test': fail,
-      'named_parameter_clash_test': fail,
-      'named_parameters_passing_falsy_test': is.firefox('<=50') ? fail : pass,
-      'nan_identical_test': fail,
-      'nested_switch_label_test': fail,
-      'number_identifier_test_05_multi': fail,
-      'number_identity2_test': fail,
-      'numbers_test': fail,
-      'regress_16640_test': fail,
-      'regress_22445_test': fail,
-      'regress_22777_test': flaky,
-      'stack_overflow_stacktrace_test': fail,
-      'stack_overflow_test': fail,
-      'stacktrace_test': chrome_fail,
-      'switch_label2_test': fail,
-      'switch_label_test': fail,
-      'switch_try_catch_test': fail,
-      'throwing_lazy_variable_test': fail,
-      'truncdiv_test': fail,  // did not throw
-      'try_catch_on_syntax_test_10_multi': fail,
-      'try_catch_on_syntax_test_11_multi': fail,
-      'type_variable_nested_test': fail,
-
-      'bit_operations_test_01_multi': fail,
-      'bit_operations_test_02_multi': fail,
-      'bit_operations_test_03_multi': fail,
-      'bit_operations_test_04_multi': fail,
-      'deferred_load_constants_test_none_multi': fail,
-      'external_test_21_multi': fail,
-      'external_test_24_multi': fail,
-      'multiline_newline_test_04_multi': fail,
-      'multiline_newline_test_05_multi': fail,
-      'multiline_newline_test_06_multi': fail,
-      'multiline_newline_test_none_multi': fail,
-
-      // https://github.com/dart-lang/sdk/issues/26124
-      'prefix10_negative_test': fail,
-
-      'library_prefixes_test1': 'skip', // not a test
-      'library_prefixes_test2': 'skip', // not a test
-      'top_level_prefixed_library_test': 'skip', // not a test
-
-    },
-
-    'language/function_type': {},
-
-    'language/covariant_override': {},
-
-    'language/function_type': {
-      'function_type50_test': fail,
-      'function_type58_test': fail,
-    },
-
-    'codegen': {},
-
-    'corelib_2': {},
-
-    'corelib_2/regexp': {},
-
-    'lib/async': {
-      'async_await_zones_test': fail,
-      'first_regression_test': async_unittest,
-      'future_or_bad_type_test_implements_multi': fail,
-      'future_or_bad_type_test_none_multi': fail,
-      'future_or_non_strong_test': fail,
-      'future_test_none_multi': fail,
-      'future_timeout_test': async_unittest,
-      'intercept_schedule_microtask5_test': async_unittest,
-      'multiple_timer_test': async_unittest,
-      'futures_test': fail,
-      'schedule_microtask2_test': async_unittest,
-      'schedule_microtask3_test': async_unittest,
-      'schedule_microtask5_test': async_unittest,
-      'stream_controller_async_test': async_unittest,
-      'stream_first_where_test': async_unittest,
-      'stream_from_iterable_test': async_unittest,
-      'stream_iterator_test': async_unittest,
-      'stream_join_test': async_unittest,
-      'stream_last_where_test': async_unittest,
-      'stream_periodic2_test': async_unittest,
-      'stream_periodic3_test': async_unittest,
-      'stream_periodic4_test': async_unittest,
-      'stream_periodic5_test': async_unittest,
-      'stream_periodic6_test': async_unittest,
-      'stream_periodic_test': async_unittest,
-      'stream_single_test': async_unittest,
-      'stream_single_to_multi_subscriber_test': async_unittest,
-      'stream_state_helper': async_unittest,
-      'stream_state_nonzero_timer_test': async_unittest,
-      'stream_state_test': async_unittest,
-      'stream_subscription_as_future_test': async_unittest,
-      'stream_subscription_cancel_test': async_unittest,
-      'stream_timeout_test': async_unittest,
-      'stream_transform_test': async_unittest,
-      'stream_transformation_broadcast_test': async_unittest,
-      'stream_transformer_from_handlers_test': fail,
-      'timer_cancel1_test': async_unittest,
-      'timer_cancel2_test': async_unittest,
-      'timer_cancel_test': async_unittest,
-      'timer_isActive_test': async_unittest,
-      'timer_not_available_test': fail,
-      'timer_repeat_test': async_unittest,
-      'timer_test': async_unittest,
-      'zone_error_callback_test': fail,
-      'zone_run_unary_test': fail,
-    },
-
-    'lib/collection': {},
-
-    'lib/convert': {
-      'base64_test_01_multi': 'slow',
-      'chunked_conversion_utf85_test': 'slow',
-
-      'encoding_test': skip_timeout,
-
-      'json_utf8_chunk_test': skip_timeout,
-      'latin1_test': skip_timeout,
-
-      'streamed_conversion_json_encode1_test': skip_timeout,
-      'streamed_conversion_json_utf8_decode_test': skip_timeout,
-      'streamed_conversion_json_utf8_encode_test': skip_timeout,
-      'streamed_conversion_utf8_decode_test': skip_timeout,
-      'streamed_conversion_utf8_encode_test': skip_timeout,
-      'utf85_test': skip_timeout,
-    },
-
-    'lib/html': {
-      'async_spawnuri_test': async_unittest,
-      'async_test': async_unittest,
-
-       // was https://github.com/dart-lang/sdk/issues/27578, needs triage
-      'audiocontext_test': is.chrome('<=54') ? fail : pass,
-
-      'cross_domain_iframe_test': async_unittest,
-      'cssstyledeclaration_test': async_unittest,
-      'css_test': async_unittest,
-
-      // This is failing with a range error, I'm guessing because it's looking
-      // for a stylesheet and the page has none.
-      'css_rule_list_test': 'fail',
-
-      'custom_element_method_clash_test': async_unittest,
-      'custom_element_name_clash_test': async_unittest,
-      'custom_elements_23127_test': async_unittest,
-      'custom_elements_test': async_unittest,
-
-      // Please do not mark this test as fail. If your change breaks this test,
-      // please look at the test for instructions on how to generate a new
-      // golden file.
-      'debugger_test': firefox_fail,
-
-      // https://github.com/dart-lang/sdk/issues/27579.
-      'element_classes_test': 'fail',
-      'element_classes_svg_test': 'fail',
-
-      // Failure: 'Expected 56 to be in the inclusive range [111, 160].'.
-      'element_offset_test': 'fail',
-
-      'element_test': async_unittest,
-      // This may no longer be a valid test?
-      'element_types_test': is.chrome('<=56') ? pass : fail,
-      'event_customevent_test': async_unittest,
-      'events_test': async_unittest,
-      'fileapi_test': async_unittest,
-      'filereader_test': async_unittest,
-      'fontface_loaded_test': async_unittest,
-      'fontface_test': firefox_fail,
-      'form_data_test': async_unittest,
-      'history_test': async_unittest,
-      'indexeddb_1_test': async_unittest,
-      'indexeddb_2_test': async_unittest,
-      'indexeddb_3_test': async_unittest,
-      'indexeddb_4_test': async_unittest,
-      'indexeddb_5_test': async_unittest,
-
-      // was https://github.com/dart-lang/sdk/issues/27578, needs triage
-      'input_element_test': 'fail',
-
-      'interactive_test': async_unittest,
-      'isolates_test': async_unittest,
-
-      'js_interop_1_test': async_unittest,
-
-      // The "typed literal" test fails because the object does not have "_c".
-      'js_util_test': 'fail',
-      'keyboard_event_test': async_unittest,
-
-      // was https://github.com/dart-lang/sdk/issues/27578, needs triage
-      'mediasource_test': 'fail',
-      'media_stream_test': 'fail',
-
-      // https://github.com/dart-lang/sdk/issues/29071
-      'messageevent_test': firefox_fail,
-
-      'mutationobserver_test': async_unittest,
-      'native_gc_test': async_unittest,
-      'postmessage_structured_test': async_unittest,
-
-      // this is timing out on Chrome Canary only
-      // pinning this skip in case it's a transient canary issue
-      'queryall_test': is.chrome('59') ? ['skip'] : ['slow'], // see sdk #27794
-
-      'request_animation_frame_test': async_unittest,
-      'resource_http_test': async_unittest,
-
-      // was https://github.com/dart-lang/sdk/issues/27578, needs triage
-      'rtc_test': is.chrome('<=55') ? fail : pass,
-
-      // https://github.com/dart-lang/sdk/issues/29071
-      'serialized_script_value_test': firefox_fail,
-
-      'shadow_dom_test': firefox_fail,
-
-      // was https://github.com/dart-lang/sdk/issues/27578, needs triage
-      'speechrecognition_test': firefox_fail,
-      'text_event_test': firefox_fail,
-
-      // was https://github.com/dart-lang/sdk/issues/27578, needs triage
-      'touchevent_test': 'fail',
-
-      'transferables_test': async_unittest,
-      'transition_event_test': async_unittest,
-      'url_test': async_unittest,
-      'websocket_test': async_unittest,
-      'websql_test': async_unittest,
-      'wheelevent_test': async_unittest,
-      'worker_api_test': async_unittest,
-      'worker_test': async_unittest,
-
-      'xhr_cross_origin_test': async_unittest,
-      'xhr_test': async_unittest,
-
-      // Failing when it gets 3 instead of 42.
-      'js_typed_interop_default_arg_test_default_value_multi': 'fail',
-    },
-
-    'lib/html/custom': {
-      'attribute_changed_callback_test': async_unittest,
-      'constructor_calls_created_synchronously_test': async_unittest,
-      'created_callback_test': async_unittest,
-      'entered_left_view_test': async_unittest,
-      'js_custom_test': async_unittest,
-      'mirrors_test': async_unittest,
-      'regress_194523002_test': async_unittest,
-    },
-
-    'lib/math': {
-      // TODO(het): triage
-      'double_pow_test': fail,
-      'low_test': fail,
-      'pi_test': skip_timeout,
-      'random_big_test': fail,
-    },
-
-    'lib/typed_data': {
-      // No bigint or int64 support
-      'int32x4_bigint_test': fail,
-      'int64_list_load_store_test': fail,
-      'typed_data_hierarchy_int64_test': fail,
-      'typed_data_list_test': fail,
-    },
-
-    'lib/mirrors': {
-      'abstract_class_test_none_multi': fail,
-      'accessor_cache_overflow_test': fail,
-      'basic_types_in_dart_core_test': fail,
-      'class_mirror_location_test': fail,
-      'class_mirror_type_variables_test': fail,
-      'closurization_equivalence_test': fail,
-      'constructor_kinds_test_01_multi': fail,
-      'constructor_kinds_test_none_multi': fail,
-      'constructor_private_name_test': fail,
-      'declarations_type_test': fail,
-      'deferred_mirrors_metadata_test': skip_timeout,
-      'deferred_mirrors_metatarget_test': skip_timeout,
-      'deferred_mirrors_update_test': fail,
-      'empty_test': fail,
-      'equality_test': fail,
-      'fake_function_with_call_test': fail,
-      'field_type_test': fail,
-      'function_type_mirror_test': fail,
-      'generic_f_bounded_test_01_multi': fail,
-      'generic_f_bounded_test_none_multi': fail,
-      'generic_function_typedef_test': fail,
-      'generic_interface_test_none_multi': fail,
-      'generic_local_function_test': fail,
-      'generic_mixin_applications_test': fail,
-      'generic_mixin_test': fail,
-      'generic_superclass_test_01_multi': fail,
-      'generic_superclass_test_none_multi': fail,
-      'generic_type_mirror_test': fail,
-      'generics_double_substitution_test_01_multi': fail,
-      'generics_double_substitution_test_none_multi': fail,
-      'generics_dynamic_test': fail,
-      'generics_special_types_test': fail,
-      'generics_substitution_test': fail,
-      'generics_test_none_multi': fail,
-      'globalized_closures2_test_00_multi': fail,
-      'globalized_closures2_test_none_multi': fail,
-      'globalized_closures_test_00_multi': fail,
-      'globalized_closures_test_none_multi': fail,
-      'hot_get_field_test': fail,
-      'hot_set_field_test': fail,
-      'inherited_metadata_test': fail,
-      'instance_members_unimplemented_interface_test': fail,
-      'instance_members_with_override_test': fail, // JsClassMirror.instanceMembers unimplemented
-      'instantiate_abstract_class_test': fail,
-      'invocation_fuzz_test_emptyarray_multi': fail,
-      'invocation_fuzz_test_false_multi': fail,
-      'invocation_fuzz_test_none_multi': fail,
-      'invocation_fuzz_test_smi_multi': fail,
-      'invocation_fuzz_test_string_multi': fail,
-      'invoke_call_on_closure_test': fail,
-      'invoke_closurization2_test': fail,
-      'invoke_closurization_test': fail,
-      'invoke_import_test': fail,
-      'invoke_named_test_01_multi': fail,
-      'invoke_named_test_none_multi': fail,
-      'invoke_natives_malicious_test': fail,
-      'invoke_private_test': fail,
-      'invoke_private_wrong_library_test': fail,
-      'invoke_test': fail,
-      'invoke_throws_test': fail,
-      'libraries_test': fail,
-      'library_imports_bad_metadata_test_none_multi': fail,
-      'library_metadata_test': fail,
-      'library_uri_io_test': async_unittest,
-      'library_uri_package_test': async_unittest,
-      'list_constructor_test_01_multi': fail,
-      'list_constructor_test_none_multi': fail,
-      'load_library_test': fail,
-      'local_function_is_static_test': fail,
-      'local_isolate_test': fail,
-      'metadata_allowed_values_test_none_multi': fail,
-      'metadata_scope_test_none_multi': fail,
-      'metadata_test': fail,
-      'method_mirror_location_test': fail,
-      'method_mirror_returntype_test': fail,
-      'method_mirror_source_line_ending_test': fail,
-      'method_mirror_source_test': fail,
-      'mirrors_reader_test': fail,
-      'mirrors_used_typedef_declaration_test_01_multi': fail,
-      'mirrors_used_typedef_declaration_test_none_multi': fail,
-      'mixin_test': fail,
-      'null2_test': fail,
-      'null_test': fail,
-      'other_declarations_location_test': fail,
-      'parameter_annotation_mirror_test': fail,
-      'parameter_is_const_test_none_multi': fail,
-      'parameter_metadata_test': fail,
-      'private_class_field_test': fail,
-      'private_symbol_mangling_test': fail,
-      'private_types_test': fail,
-      'reflect_class_test_none_multi': fail,
-      'reflect_runtime_type_test': fail,
-      'reflect_uninstantiated_class_test': fail,
-      'reflected_type_classes_test_none_multi': fail,
-      'reflected_type_function_type_test': fail,
-      'reflected_type_special_types_test': fail,
-      'reflected_type_test_none_multi': fail,
-      'reflected_type_typedefs_test': fail,
-      'reflected_type_typevars_test': fail,
-      'regress_14304_test': fail,
-      'regress_26187_test': fail,
-      'relation_assignable_test': fail,
-      'relation_subtype_test': fail,
-      'set_field_with_final_test': fail,
-      'set_field_with_final_inheritance_test': fail,
-      'symbol_validation_test_01_multi': fail,
-      'symbol_validation_test_none_multi': fail,
-      'to_string_test': fail,
-      'type_argument_is_type_variable_test': fail,
-      'type_variable_is_static_test': fail,
-      'type_variable_owner_test_01_multi': fail,
-      'type_variable_owner_test_none_multi': fail,
-      'typedef_deferred_library_test': fail,  // Isolate spawn not support
-      'typedef_library_test': fail,
-      'typedef_metadata_test': fail,
-      'typedef_test': fail,
-      'typevariable_mirror_metadata_test': fail,
-      'unnamed_library_test': fail,
-      'variable_is_const_test_none_multi': fail,
-    },
-  };
-
-  function countMatches(text, regex) {
-    let matches = text.match(regex);
-    return matches ? matches.length : 0;
-  }
-  function libraryName(name) {
-    return name.replace(/-/g, '$45');
-  }
-
-  let unittest_tests = [];
-  let unittestAccidentallyInitialized = false;
-
-  // Pattern for selecting out generated test files in sub-directories
-  // of the codegen directory.  These are the language, corelib, etc
-  // tests
-  let languageTestPattern =
-      new RegExp('gen/codegen_output/(.*)/([^/]*_test[^/]*)');
-  // Pattern for selecting out generated test files in the toplevel
-  // codegen directory.  These are codegen tests that should be
-  // executed.
-  let codegenTestPattern =
-      new RegExp('gen/codegen_output/([^/]*_test[^/]*)');
-  // We need to let Dart unittest control when tests are run not mocha.
-  // mocha.allowUncaught(true);
-  for (let testFile of allTestFiles) {
-    let status_group;
-    let name;
-    let module;
-    let match = languageTestPattern.exec(testFile);
-    if (match != null) {
-      status_group = match[1];
-      name = match[2];
-      module = match[0];
-    } else if ((match = codegenTestPattern.exec(testFile)) != null) {
-      status_group = 'codegen';
-      name = match[1];
-      module = match[0];
-    }
-    if (match != null) {
-      let status = all_status[status_group];
-      if (status == null) throw "No status for '" + status_group + "'";
-
-      let expectation = status[name];
-      if (expectation == null) expectation = [];
-      if (typeof expectation == 'string') expectation = [expectation];
-      let has = (tag) => expectation.indexOf(tag) >= 0;
-
-      if (has('skip')) {
-        let why = 'for unknown reason';
-        if (has('timeout')) why = 'known timeout';
-        if (has('fail')) why = 'known failure';
-        console.debug('Skipping ' + why + ': ' + name);
-        continue;
-      }
-
-      // A few tests are special because they use package:unittest.
-      // We run them below.
-      let mainLibrary = require(module)[libraryName(name)];
-      if (mainLibrary._usesUnittestPackage) {
-        unittest_tests.push(() => {
-          console.log('Running unittest test ' + testFile);
-          mainLibrary.main();
-        });
-        continue;
-      }
-
-      var fullName = status_group + '/' + name;
-      test(fullName, function(done) { // 'function' to allow `this.timeout`.
-        console.debug('Running test:  ' + fullName);
-
-        // Many tests are async.  Currently, tests can indicate this in
-        // two different ways.  First, `main` can call (in Dart)
-        // `async_helper.asyncStart`.  We can check if this happened by
-        // querying `async_helper.asyncTestStarted` afterward and waiting for
-        // the callback if so.  Second, `main` can return a `Future`.  If so,
-        // we wait for that to complete.  If neither is true, we assume the
-        // test is synchronous.
-        //
-        // A 'failing' test will throw an exception.  This exception may be
-        // synchronous (i.e., during `main`) or asynchronous (after `main` in
-        // lieu of the callback/future).  The latter exceptions are not
-        // directly caught.  Instead, we intercept `window.onerror` to detect
-        // them.
-        //
-        // Note, if the test is marked 'negative' or 'fail', than pass and fail
-        // are effectively inverted: only a success is reported.
-        //
-        // In all cases, we funnel test completion through the `finish` handler
-        // below to handle reporting (based on status) and cleanup state.
-        //
-        // A test can finish in one of several ways:
-        // 1. Synchronous without an error.  In this case, `main` returns
-        //    null and did not set `async_helper`.  `finish` is invoked
-        //    immediately.
-        // 2. Synchronous error.  `main` throws an error.  `finish`
-        //    is invoked immediately with the error.
-        // 3. `Future` without an error.  In this case, the future completes
-        //    and asynchronously invokes `finish`.
-        // 4. Via `async_helper` without an error.  In this case, the
-        //    `async_helper` library triggers `finish` via its callback.
-        // 5. Asynchronously with an error.  In this case, `window.onerror`
-        //    triggers `finish` with the error.
-        // 6. Hangs.  In this case, we rely on the underlying mocha framework
-        //    timeout.
-        //
-        // TODO(vsm): This currently doesn't handle tests that trigger multiple
-        // asynchronous exceptions.
-
-        let negative = /negative_test/.test(name) ||
-            mainLibrary._expectRuntimeError;
-        let fail = has('fail');
-
-        function finish(error) {
-          // If the test left any lingering detritus in the DOM, blow it away
-          // so it doesn't interfere with later tests.
-          if (fail) {
-            if (negative) {
-              if (error) {
-                error = new Error(
-                  "negative test marked as 'fail' " +
-                  "but passed by throwing:\n" + error);
-              }
-            } else if (error) {
-              error = null
-            } else {
-              error = new Error("test marked as 'fail' but passed");
-            }
-          } else if (negative) {
-            if (!error) {
-              error = new Error("test marked as 'negative' but did not throw");
-            } else {
-              error = null;
-            }
-          }
-          minitest.finishTests();
-          document.body.innerHTML = '';
-          console.log("cleared");
-          if (error && !(error instanceof Error)) error = new Error(error);
-          done(error);
-        }
-
-        // Intercept uncaught exceptions
-        window.onerror = function(message, url, line, column, error) {
-          console.warn('Asynchronous error in ' + name + ': ' + message);
-          if (!error) {
-            error = new Error(message);
-          }
-          finish(error);
-        };
-
-        async_helper.asyncTestInitialize(finish);
-        if (has('slow')) this.timeout(10000);
-
-        var result;
-        try {
-          var result = mainLibrary.main();
-          if (result && !(dart_sdk.async.Future.is(result))) {
-            result = null;
-          }
-        } catch (e) {
-          finish(e);
-        }
-
-        // Ensure this isn't a unittest
-        if (!unittestAccidentallyInitialized &&
-            unittest.src__test_environment.environment.initialized) {
-          // This suppresses duplicate messages for later tests
-          unittestAccidentallyInitialized = true;
-          finish(new Error('Test ' + name + ' must be marked as a unittest'));
-        } else if (!async_helper.asyncTestStarted) {
-          if (!result) {
-            finish();
-          } else {
-            result.then(dart_sdk.dart.dynamic)(() => finish(),
-              { onError: (e) => finish(e) });
-          }
-        }
-      });
-    }
-  }
-
-  // We run these tests in a mocha test wrapper to avoid the confusing failure
-  // case of dart unittests being interleaved with mocha tests.
-  // In practice we are really just suppressing all mocha test behavior while
-  // Dart unittests run and then re-enabling it when the dart tests complete.
-  html_config.useHtmlConfiguration();
-  test('run all dart unittests', function(done) { // 'function' to allow `this.timeout`
-    // Use the whitelist for all unittests - there may be an error in the framework
-    // itself.
-    dart_sdk.dart.ignoreWhitelistedErrors(true);
-    if (unittest_tests.length == 0) return done();
-
-    // TODO(vsm): We're using an old deprecated version of unittest.
-    // We need to migrate all tests (in the SDK itself) off of
-    // unittest.
-
-    // All unittests need to be explicitly marked as such above.  If
-    // not, the unittest framework will be run in a 'normal' test and
-    // left in an inconsistent state at this point triggering spurious
-    // failures.  This check ensures we're not in such a state.  If it fails,
-    // we've likely added a new unittest and need to categorize it as such.
-    if (unittest.src__test_environment.environment.testCases[dart_sdk.dartx.length] != 0) {
-      return done(new Error('Unittest framework in an invalid state'));
-    }
-
-    this.timeout(100000000);
-    this.enableTimeouts(false);
-    // Suppress mocha on-error handling because it will mess up unittests.
-    window.onerror = function(err, url, line) {
-      console.error(err, url, line);
-    };
-    window.addEventListener('message', (event) => {
-      if (event.data == 'unittest-suite-done') {
-        window.console.log("Done running unittests");
-        let output = document.body.textContent;
-        // Restore the Mocha onerror handler in case future tests need to run.
-        window.onerror = mochaOnError;
-        this.enableTimeouts(true);
-        dart_sdk.dart.ignoreWhitelistedErrors(false);
-
-        let numErrors = countMatches(output, /\d\s+ERROR/g);
-        let numFails = countMatches(output, /\d\s+FAIL/g);
-        if (numErrors != num_expected_unittest_errors ||
-            numFails != num_expected_unittest_fails) {
-          output = "Expected " + num_expected_unittest_fails +
-              " fail and " + num_expected_unittest_errors +
-              " error unittests, got " + numFails + " fail and " +
-              numErrors + "error tests.\n" + output;
-          console.error(output);
-          done(new Error(output));
-        } else {
-          console.log(output);
-          done();
-        }
-      }
-    });
-
-    for (let action of unittest_tests) {
-      try {
-        action();
-      } catch (e) {
-        console.error("Caught error tying to setup test:", e);
-      }
-    }
-  });
-});
diff --git a/pkg/dev_compiler/test/browser/runtime_tests.js b/pkg/dev_compiler/test/browser/runtime_tests.js
deleted file mode 100644
index a4b29fe..0000000
--- a/pkg/dev_compiler/test/browser/runtime_tests.js
+++ /dev/null
@@ -1,1254 +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.
-
-define(['dart_sdk'], function(dart_sdk) {
-  const assert = chai.assert;
-  const async = dart_sdk.async;
-  const core = dart_sdk.core;
-  const collection = dart_sdk.collection;
-  const dart = dart_sdk.dart;
-  const dartx = dart.dartx;
-
-  dart.trapRuntimeErrors(false);
-
-  suite('ignore', () => {
-    "use strict";
-
-    let FutureOr = async.FutureOr$;
-    let Future = async.Future$;
-    let List = core.List$;
-
-    setup(() => {
-      dart_sdk.dart.ignoreWhitelistedErrors(false);
-    });
-
-    teardown(() => {
-      dart_sdk.dart.ignoreWhitelistedErrors(false);
-    });
-
-    test('FutureOr', () => {
-      let f = Future(dart.dynamic).value(42);
-      let l = [1, 2, 3];
-
-      assert.throws(() => { dart.as(f, FutureOr(core.int)); });
-      assert.throws(() => { dart.as(l, FutureOr(List(core.int)))});
-
-      dart_sdk.dart.ignoreWhitelistedErrors(true);
-      assert.equal(f, dart.as(f, FutureOr(core.int)));
-      assert.equal(l, dart.as(l, FutureOr(List(core.int))));
-    });
-  });
-
-  suite('generic', () => {
-    "use strict";
-
-    let generic = dart.generic;
-
-    test('zero arguments is not allowed', () => {
-      assert.throws(() => { generic(function(){}); });
-    });
-
-    test('dcall noSuchMethod has correct error target', () => {
-      assert.throws(() => dart.dcall(42),
-          new RegExp('NoSuchMethodError.*\nReceiver: 42', 'm'),
-          'Calls with non-function receiver should throw a NoSuchMethodError' +
-          ' with correct target');
-
-      // TODO(jmesserly): we should show the name "print" in there somewhere.
-      assert.throws(() => dart.dcall(core.print, 1, 2, 3),
-          new RegExp('NoSuchMethodError.*\n' +
-          "Receiver: Instance of '\\(Object\\) -> void'", 'm'),
-          'Calls with incorrect argument types should throw a NoSuchMethodError' +
-          ' with correct target');
-    });
-
-    test('can throw number', () => {
-      try {
-        dart.throw(42);
-      } catch (e) {
-        assert.equal(e, 42);
-      }
-    });
-
-    test('argument count cannot change', () => {
-      let SomeType = generic(function(x) { return {x: x}; });
-      assert.throws(() => { SomeType(1,2) });
-      let obj = {};
-      assert.equal(SomeType(obj).x, obj);
-      assert.equal(SomeType(obj).x, obj);
-      assert.equal(SomeType().x, dart.dynamic);
-    });
-
-    test('undefined/null are not allowed', () => {
-      let SomeType = generic(function(x) {});
-      assert.throws(() => { SomeType(void 0) });
-      SomeType(1);
-      assert.throws(() => { SomeType(void 0) });
-      SomeType(1);
-      assert.throws(() => { SomeType(null) });
-    });
-
-    test('result is memoized', () => {
-      let t1 = Object.create(null);
-      let t2 = Object.create(null);
-
-      let count = 0;
-      let SomeType = generic(function(x, y) {
-        count++;
-        return Object.create(null);
-      });
-
-      let x12 = SomeType(1, 2);
-      assert.strictEqual(SomeType(1, 2), x12);
-      assert.strictEqual(SomeType(1, 2), x12);
-      assert.strictEqual(count, 1);
-      let x11 = SomeType(1, 1);
-      assert.strictEqual(count, 2);
-      assert.strictEqual(SomeType(1, 1), x11);
-      assert.strictEqual(count, 2);
-      count = 0;
-
-      let t1t2 = SomeType(t1, t2);
-      assert.strictEqual(count, 1);
-      let t2t1 = SomeType(t2, t1);
-      assert.strictEqual(count, 2);
-      assert.notStrictEqual(t1t2, t2t1);
-      assert.strictEqual(SomeType(t1, t2), t1t2);
-      assert.strictEqual(SomeType(t2, t1), t2t1);
-      assert.strictEqual(SomeType(t1, t2), t1t2);
-      count = 0;
-
-      // Nothing has been stored on the object
-      assert.strictEqual(Object.keys(t1).length, 0);
-      assert.strictEqual(Object.keys(t2).length, 0);
-    });
-
-    test('type constructor is reflectable', () => {
-      let SomeType = generic(function(x, y) { return Object.create(null); });
-      let someValue = SomeType('hi', 123);
-      assert.equal(dart.getGenericClass(someValue), SomeType);
-      assert.deepEqual(dart.getGenericArgs(someValue), ['hi', 123]);
-    });
-
-    test('proper type constructor is called', () => {
-      // This tests https://github.com/dart-lang/dev_compiler/issues/178
-      let l = dart_sdk._interceptors.JSArray$(core.int).of([1, 2, 3]);
-      let s = l[dartx.join]();
-      assert.equal(s, '123');
-    });
-  });
-
-
-  suite('instanceOf', () => {
-    "use strict";
-
-    let expect = assert.equal;
-    let generic = dart.generic;
-    let intIsNonNullable = false;
-    let cast = dart.as;
-    let instanceOf = dart.is;
-    let strongInstanceOf = dart.strongInstanceOf;
-    let getReifiedType = dart.getReifiedType;
-    let fnTypeFuzzy = dart.fnTypeFuzzy;
-    let typedef = dart.typedef;
-    let isSubtype = dart.isSubtype;
-
-    let Object = core.Object;
-    let String = core.String;
-    let dynamic = dart.dynamic;
-    let List = core.List;
-    let Map = core.Map;
-    let Map$ = core.Map$;
-    let double = core.double;
-    let int = core.int;
-    let num = core.num;
-    let bool = core.bool;
-
-    class A {}
-    class B extends A {}
-    class C extends B {}
-
-    let AA$ = generic((T, U) => {
-      class AA extends core.Object {}
-      (AA.new = function() {}).prototype = AA.prototype;
-      return AA;
-    });
-    let AA = AA$();
-    let BB$ = generic((T, U) => {
-      class BB extends AA$(U, T) {}
-      (BB.new = function() {}).prototype = BB.prototype;
-      return BB;
-    });
-    let BB = BB$();
-    class CC extends BB$(String, List) {}
-    (CC.new = function() {}).prototype = CC.prototype;
-
-    let Func2 = typedef('Func2', () => fnTypeFuzzy(dynamic, [dynamic, dynamic]));
-    let Foo = typedef('Foo', () => fnTypeFuzzy(B, [B, String]));
-
-    let FuncG$ = generic((T, U) => typedef('FuncG', () => fnTypeFuzzy(T, [T, U])))
-    let FuncG = FuncG$();
-
-    // TODO(vsm): Revisit when we encode types on functions properly.
-    // A bar1(C c, String s) => null;
-    function bar1(c, s) { return null; }
-    dart.fn(bar1, dart.fnType(A, [C, String]));
-
-    // bar2(B b, String s) => null;
-    function bar2(b, s) { return null; }
-    dart.fn(bar2, dart.fnType(dynamic, [B, String]));
-
-    // B bar3(B b, Object o) => null;
-    function bar3(b, o) { return null; }
-    dart.fn(bar3, dart.fnType(B, [B, Object]));
-
-    // B bar4(B b, o) => null;
-    function bar4(b, o) { return null; }
-    dart.fn(bar4, dart.fnType(B, [B, dynamic]));
-
-    // C bar5(A a, Object o) => null;
-    function bar5(a, o) { return null; }
-    dart.fn(bar5, dart.fnType(C, [A, Object]));
-
-    // B bar6(B b, String s, String o) => null;
-    function bar6(b, s, o) { return null; }
-    dart.fn(bar6, dart.fnType(B, [B, String, String]));
-
-    // B bar7(B b, String s, [Object o]) => null;
-    function bar7(b, s, o) { return null; }
-    dart.fn(bar7, dart.fnType(B, [B, String], [Object]));
-
-    // B bar8(B b, String s, {Object p}) => null;
-    function bar8(b, s, o) { return null; }
-    dart.fn(bar8, dart.fnType(B, [B, String], {p: Object}));
-
-    let cls1 = dart.fn((c, s) => { return null; },
-                       dart.fnType(A, [C, String]));
-
-    let cls2 = dart.fn((b, s) => { return null; },
-                       dart.fnType(dynamic, [B, String]));
-
-    let cls3 = dart.fn((b, o) => { return null; },
-                       dart.fnType(B, [B, Object]));
-
-    let cls4 = dart.fn((b, o) => { return null; },
-                       dart.fnType(B, [B, dynamic]));
-
-    let cls5 = dart.fn((a, o) => { return null; },
-                       dart.fnType(C, [A, Object]));
-
-    let cls6 = dart.fn((b, s, o) => { return null; },
-                       dart.fnType(B, [B, String, String]));
-
-    let cls7 = dart.fn((b, s, o) => { return null; },
-                       dart.fnType(B, [B, String], [Object]));
-
-    let cls8 =
-      dart.fn((b, s, o) => { return null; },
-              dart.fnType(B, [B, String], {p: Object}));
-
-    function checkType(x, type, expectedTrue) {
-      if (expectedTrue === undefined) expectedTrue = true;
-      expect(instanceOf(x, type), expectedTrue,
-        '"' + x + '" ' +
-        (expectedTrue ? 'should' : 'should not') +
-        ' be an instance of "' + dart.typeName(type) + '"');
-    }
-
-    test('int', () => {
-      checkType(5, int);
-      checkType(5, dynamic);
-      checkType(5, Object);
-      checkType(5, num);
-
-      checkType(5, bool, false);
-      checkType(5, String, false);
-
-      expect(cast(5, int), 5);
-      if (intIsNonNullable) {
-        expect(() => cast(null, int), throws);
-      } else {
-        expect(cast(null, int), null);
-      }
-    });
-
-    test('dynamic', () => {
-      checkType(new Object.new(), dynamic);
-      checkType(null, dynamic);
-
-      expect(cast(null, dynamic), null);
-    });
-
-    test('Object', () => {
-      checkType(new Object.new(), dynamic);
-      checkType(null, Object);
-
-      expect(cast(null, Object), null);
-    });
-
-    test('null', () => {
-      // Object, dynamic cases are already handled above.
-      checkType(null, core.Null);
-      checkType(null, core.String, false);
-      checkType(null, core.int, false);
-      checkType(null, Map, false);
-      checkType(void 0, core.Null);
-      checkType(void 0, core.Object);
-      checkType(void 0, dart.dynamic);
-    });
-
-    test('String', () => {
-      checkType("foo", String);
-      checkType("foo", Object);
-      checkType("foo", dynamic);
-
-      expect(cast(null, String), null);
-    });
-
-    test('FutureOr', () => {
-      let FutureOr = async.FutureOr$;
-
-      assert.equal(dart.as(3, FutureOr(int)), 3);
-      assert.equal(dart.as(3, FutureOr(double)), 3);
-      assert.throws(() => dart.as(3.5, FutureOr(int)));
-      assert.equal(dart.as(3.5, FutureOr(double)), 3.5);
-      assert.isTrue(dart.is(3, FutureOr(int)));
-      assert.isTrue(dart.is(3, FutureOr(double)));
-      assert.isFalse(dart.is(3.5, FutureOr(int)));
-      assert.isTrue(dart.is(3.5, FutureOr(double)));
-
-      assert.equal(dart.as(3, FutureOr(FutureOr(double))), 3);
-      assert.isTrue(dart.is(3, FutureOr(FutureOr(double))));
-
-    });
-
-    test('Map', () => {
-      let m1 = Map$(String, String).new();
-      let m2 = Map$(Object, Object).new();
-      let m3 = Map.new();
-      let m4 = collection.HashMap$(dart.dynamic, dart.dynamic).new();
-      let m5 = collection.LinkedHashMap.new();
-      let m6 = Map$(String, dart.dynamic).new();
-
-      // Map<T1,T2> <: Map
-      checkType(m1, Map);
-      checkType(m1, Object);
-
-      // Instance of self
-      checkType(m1, getReifiedType(m1));
-      checkType(m1, Map$(String, String));
-
-      // Covariance on generics
-      checkType(m1, getReifiedType(m2));
-      checkType(m1, Map$(Object, Object));
-
-      // No contravariance on generics.
-      checkType(m2, getReifiedType(m1), false);
-      checkType(m2, Map$(String, String), false);
-
-      // null is! Map
-      checkType(null, Map, false);
-
-      // Raw generic types
-      checkType(m5, Map);
-      checkType(m4, Map);
-
-      // Is checks
-      assert.isFalse(dart.is(m3, Map$(String, String)));
-      assert.isFalse(dart.is(m6, Map$(String, String)));
-      assert.isTrue(dart.is(m1, Map$(String, String)));
-      assert.isFalse(dart.is(m2, Map$(String, String)));
-
-      // As checks
-      // TODO(vsm): Enable these.  We're currently only logging warnings on
-      // StrongModeErrors.
-      // assert.throws(() => dart.as(m3, Map$(String, String)),
-      //   dart.StrongModeError);
-      // assert.throws(() => dart.as(m6, Map$(String, String)),
-      //   dart.StrongModeError);
-      assert.equal(dart.as(m1, Map$(String, String)), m1);
-      // assert.throws(() => dart.as(m2, Map$(String, String)),
-      //   dart.StrongModeError);
-    });
-
-    test('constructors', () => {
-      class C extends core.Object {
-      }
-      (C.new = function(x) {}).prototype = C.prototype;
-      (C.named = function(x, y) {}).prototype = C.prototype;
-      dart.setSignature(C, {
-        constructors: () => ({
-          new: dart.fnType(C, [core.int]),
-          named: dart.fnType(C, [core.int, core.int])
-        })
-      });
-      let getType = dart.classGetConstructorType;
-      isSubtype(getType(C), dart.fnTypeFuzzy(C, [core.int]));
-      isSubtype(getType(C), dart.fnTypeFuzzy(C, [core.String]), false);
-      isSubtype(getType(C, 'new'), dart.fnTypeFuzzy(C, [core.int]));
-      isSubtype(getType(C, 'new'), dart.fnTypeFuzzy(C, [core.String]), false);
-      isSubtype(getType(C, 'named'), dart.fnTypeFuzzy(C, [core.int, core.int]));
-      isSubtype(getType(C, 'named'),
-                dart.fnTypeFuzzy(C, [core.int, core.String]), false);
-    });
-
-    test('generic and inheritance', () => {
-      let aaraw = new AA.new();
-      let aarawtype = getReifiedType(aaraw);
-      let aadynamic = new (AA$(dynamic, dynamic).new)();
-      let aadynamictype = getReifiedType(aadynamic);
-      let aa = new (AA$(String, List).new)();
-      let aatype = getReifiedType(aa);
-      let bb = new (BB$(String, List).new)();
-      let bbtype = getReifiedType(bb);
-      let cc = new CC.new();
-      let cctype = getReifiedType(cc);
-      // We don't allow constructing bad types.
-      // This was AA<String> in Dart (wrong number of type args).
-      let aabad = new (AA$(dart.dynamic, dart.dynamic).new)();
-      let aabadtype = getReifiedType(aabad);
-
-      checkType(cc, aatype, false);
-      checkType(cc, AA$(String, List), false);
-      checkType(cc, bbtype);
-      checkType(cc, BB$(String, List));
-      checkType(aa, cctype, false);
-      checkType(aa, CC, false);
-      checkType(aa, bbtype, false);
-      checkType(aa, BB$(String, List), false);
-      checkType(bb, cctype, false);
-      checkType(bb, CC, false);
-      checkType(aa, aabadtype);
-      checkType(aa, dynamic);
-      checkType(aabad, aatype, false);
-      checkType(aabad, AA$(String, List), false);
-      checkType(aabad, aarawtype);
-      checkType(aabad, AA);
-      checkType(aaraw, aabadtype);
-      checkType(aaraw, AA$(dart.dynamic, dart.dynamic));
-      checkType(aaraw, aadynamictype);
-      checkType(aaraw, AA$(dynamic, dynamic));
-      checkType(aadynamic, aarawtype);
-      checkType(aadynamic, AA);
-    });
-
-    test('void', () => {
-      //checkType((x) => x, type((void _(x)) {}));
-    });
-
-    test('mixins', () => {
-      let c = collection;
-      var s1 = new (c.SplayTreeSet$(String).new)();
-
-      checkType(s1, c.IterableMixin);
-      checkType(s1, c.IterableMixin$(String));
-      checkType(s1, c.IterableMixin$(int), false);
-
-      checkType(s1, c.SetMixin);
-      checkType(s1, c.SetMixin$(String));
-      checkType(s1, c.SetMixin$(int), false);
-    });
-
-    test('Type', () => {
-      checkType(int, core.Type, true);
-      checkType(num, core.Type, true);
-      checkType(bool, core.Type, true);
-      checkType(String, core.Type, true);
-      checkType(dynamic, core.Type, true);
-      checkType(Object, core.Type, true);
-      checkType(List, core.Type, true);
-      checkType(Map, core.Type, true);
-      checkType(Map$(int, String), core.Type, true);
-      checkType(Func2, core.Type, true);
-      checkType(fnTypeFuzzy(dynamic, [dynamic]), core.Type, true);
-      checkType(core.Type, core.Type, true);
-
-      checkType(3, core.Type, false);
-      checkType("hello", core.Type, false);
-    })
-
-    test('Functions', () => {
-      // - return type: Dart is bivariant.  We're covariant.
-      // - param types: Dart is bivariant.  We're contravariant.
-      checkType(bar1, Foo, false);
-      checkType(cls1, Foo, false);
-      checkType(bar1, fnTypeFuzzy(B, [B, String]), false);
-      checkType(cls1, fnTypeFuzzy(B, [B, String]), false);
-      checkType(bar2, Foo, false);
-      checkType(cls2, Foo, false);
-      checkType(bar2, fnTypeFuzzy(B, [B, String]), false);
-      checkType(cls2, fnTypeFuzzy(B, [B, String]), false);
-      checkType(bar3, Foo);
-      checkType(cls3, Foo);
-      checkType(bar3, fnTypeFuzzy(B, [B, String]));
-      checkType(cls3, fnTypeFuzzy(B, [B, String]));
-      checkType(bar4, Foo, true);
-      checkType(cls4, Foo, true);
-      checkType(bar4, fnTypeFuzzy(B, [B, String]), true);
-      checkType(cls4, fnTypeFuzzy(B, [B, String]), true);
-      checkType(bar5, Foo);
-      checkType(cls5, Foo);
-      checkType(bar5, fnTypeFuzzy(B, [B, String]));
-      checkType(cls5, fnTypeFuzzy(B, [B, String]));
-      checkType(bar6, Foo, false);
-      checkType(cls6, Foo, false);
-      checkType(bar6, fnTypeFuzzy(B, [B, String]), false);
-      checkType(cls6, fnTypeFuzzy(B, [B, String]), false);
-      checkType(bar7, Foo);
-      checkType(cls7, Foo);
-      checkType(bar7, fnTypeFuzzy(B, [B, String]));
-      checkType(cls7, fnTypeFuzzy(B, [B, String]));
-      checkType(bar7, getReifiedType(bar6));
-      checkType(cls7, getReifiedType(bar6));
-      checkType(bar8, Foo);
-      checkType(cls8, Foo);
-      checkType(bar8, fnTypeFuzzy(B, [B, String]));
-      checkType(cls8, fnTypeFuzzy(B, [B, String]));
-      checkType(bar8, getReifiedType(bar6), false);
-      checkType(cls8, getReifiedType(bar6), false);
-      checkType(bar7, getReifiedType(bar8), false);
-      checkType(cls7, getReifiedType(bar8), false);
-      checkType(bar8, getReifiedType(bar7), false);
-      checkType(cls8, getReifiedType(bar7), false);
-
-      // Parameterized typedefs
-      checkType(bar1, FuncG$(B, String), false);
-      checkType(cls1, FuncG$(B, String), false);
-      checkType(bar3, FuncG$(B, String));
-      checkType(cls3, FuncG$(B, String));
-    });
-
-    test('dcall', () => {
-      function dd2d(x, y) {return x};
-      dart.fn(dd2d);
-      function ii2i(x, y) {return x};
-      dart.fn(ii2i, dart.fnType(core.int, [core.int, core.int]));
-      function ii_2i(x, y) {return x};
-      dart.fn(ii_2i, dart.fnType(core.int, [core.int], [core.int]));
-      function i_i2i(x, opts) {return x};
-      dart.fn(i_i2i,
-              dart.fnType(core.int, [core.int], {extra: core.int}));
-
-      assert.equal(dart.dcall(dd2d, 0, 1), 0);
-      assert.equal(dart.dcall(dd2d, "hello", "world"), "hello");
-      assert.throws(() => dart.dcall(dd2d, 0));
-      assert.throws(() => dart.dcall(dd2d, 0, 1, 2));
-      assert.throws(() => dart.dcall(dd2d, 0, 1, {extra : 3}));
-      // This should throw but currently doesn't.
-      //    assert.throws(() => dart.dcall(dd2d, 0, {extra:3}));
-
-      assert.equal(dart.dcall(ii2i, 0, 1), 0);
-      assert.throws(() => dart.dcall(ii2i, "hello", "world"));
-      assert.throws(() => dart.dcall(ii2i, 0));
-      assert.throws(() => dart.dcall(ii2i, 0, 1, 2));
-
-      assert.equal(dart.dcall(ii_2i, 0, 1), 0);
-      assert.throws(() => dart.dcall(ii_2i, "hello", "world"));
-      assert.equal(dart.dcall(ii_2i, 0), 0);
-      assert.throws(() => dart.dcall(ii_2i, 0, 1, 2));
-
-      assert.throws(() => dart.dcall(i_i2i, 0, 1));
-      assert.throws(() => dart.dcall(i_i2i, "hello", "world"));
-      assert.equal(dart.dcall(i_i2i, 0), 0);
-      assert.throws(() => dart.dcall(i_i2i, 0, 1, 2));
-      assert.equal(dart.dcall(i_i2i, 0, {extra: 3}), 0);
-    });
-
-    test('dsend', () => {
-      class Tester extends core.Object {
-        m(x, y) {return x;}
-        call(x) {return x;}
-        static s(x, y) { return x;}
-      }
-      (Tester.new = function() {
-        this.f = dart.fn(x => x,
-                          dart.fnType(core.int, [core.int]));
-        this.me = this;
-      }).prototype = Tester.prototype;
-      dart.setSignature(Tester, {
-        methods: () => ({
-          m: dart.fnType(core.int, [core.int, core.int]),
-          call: dart.fnType(core.int, [core.int])
-        }),
-        statics: () => ({
-          s: dart.fnType(core.String, [core.String])
-        }),
-        names: ['s']
-      })
-      let o = new Tester.new();
-
-      // Method send
-      assert.equal(dart.dsend(o, 'm', 3, 4), 3);
-      assert.equal(dart.dsend(o, 'm', null, 4), null);
-      assert.throws(() => dart.dsend(o, 'm', 3));
-      assert.throws(() => dart.dsend(o, 'm', "hello", "world"));
-      assert.throws(() => dart.dsend(o, 'q', 3));
-
-      // Method send through a field
-      assert.equal(dart.dsend(o, 'f', 3), 3);
-      assert.equal(dart.dsend(o, 'f', null), null);
-      assert.throws(() => dart.dsend(o, 'f', "hello"));
-      assert.throws(() => dart.dsend(o, 'f', 3, 4));
-
-      // Static method call
-      assert.equal(dart.dcall(Tester.s, "hello"), "hello");
-      assert.equal(dart.dcall(Tester.s, null), null);
-      assert.throws(() => dart.dcall(Tester.s, "hello", "world"));
-      assert.throws(() => dart.dcall(Tester.s, 0, 1));
-
-      // Calling an object with a call method
-      assert.equal(dart.dcall(o, 3), 3);
-      assert.equal(dart.dcall(o, null), null);
-      assert.throws(() => dart.dcall(o, "hello"));
-      assert.throws(() => dart.dcall(o, 3, 4));
-
-      // Calling through a field containing an object with a call method
-      assert.equal(dart.dsend(o, 'me', 3), 3);
-      assert.equal(dart.dsend(o, 'me', null), null);
-      assert.throws(() => dart.dsend(o, 'me', "hello"));
-      assert.throws(() => dart.dsend(o, 'me', 3, 4));
-    });
-
-    test('Types on top level functions', () => {
-      // Test some generated code
-      // Test the lazy path
-      checkType(core.identityHashCode,
-                dart.fnTypeFuzzy(core.int, [core.Object]));
-      // Test the normal path
-      checkType(core.identical,
-                dart.fnTypeFuzzy(core.bool,
-                                  [core.Object, core.Object]));
-
-      // Hand crafted tests
-      // All dynamic
-      function dd2d(x, y) {return x};
-      dart.fn(dd2d);
-      checkType(dd2d, dart.fnTypeFuzzy(dart.dynamic,
-                                        [dart.dynamic, dart.dynamic]));
-
-      // Set the type eagerly
-      function ii2i(x, y) {return x};
-      dart.fn(ii2i, dart.fnType(core.int, [core.int, core.int]));
-      checkType(ii2i, dart.fnTypeFuzzy(core.int,
-                                        [core.int, core.int]));
-
-      // Set the type lazily
-      function ss2s(x, y) {return x};
-      var coreString;
-      dart.lazyFn(ss2s,
-                  () => dart.fnType(coreString,
-                                                  [coreString, coreString]));
-      coreString = core.String;
-      checkType(ss2s, dart.fnTypeFuzzy(core.String,
-                                        [core.String, core.String]));
-
-      // Optional types
-      function ii_2i(x, y) {return x};
-      dart.fn(ii_2i, dart.fnType(core.int, [core.int], [core.int]));
-      checkType(ii_2i, dart.fnTypeFuzzy(core.int, [core.int],
-                                         [core.int]));
-      checkType(ii_2i, dart.fnTypeFuzzy(core.int, [core.int,
-                                                    core.int]));
-      checkType(ii_2i, dart.fnTypeFuzzy(core.int, [], [core.int,
-                                                        core.int]),
-                false);
-      checkType(ii_2i, dart.fnTypeFuzzy(core.int, [core.int],
-                                         {extra: core.int}), false);
-
-      // Named types
-      function i_i2i(x, opts) {return x};
-      dart.fn(i_i2i, dart.fnType(core.int, [core.int],
-                                               {extra: core.int}));
-      checkType(i_i2i, dart.fnTypeFuzzy(core.int, [core.int],
-                                         {extra: core.int}));
-      checkType(i_i2i, dart.fnTypeFuzzy(core.int,
-                                         [core.int, core.int]), false);
-      checkType(i_i2i, dart.fnTypeFuzzy(core.int, [core.int], {}));
-      checkType(i_i2i,
-          dart.fnTypeFuzzy(core.int, [], {extra: core.int,
-                                           also: core.int}), false);
-      checkType(i_i2i,
-          dart.fnTypeFuzzy(core.int, [core.int], [core.int]), false);
-    });
-
-    test('Method tearoffs', () => {
-      let c = collection;
-      // Tear off of an inherited method
-      let map = Map$(core.int, core.String).new();
-      checkType(dart.bind(map, 'toString'),
-                dart.fnTypeFuzzy(String, []));
-      checkType(dart.bind(map, 'toString'),
-                dart.fnTypeFuzzy(int, []), false, true);
-
-      // Tear off of a method directly on the object
-      let smap = new (c.SplayTreeMap$(core.int, core.String).new)();
-      checkType(dart.bind(smap, 'forEach'),
-          dart.fnTypeFuzzy(dart.void,
-                            [dart.fnTypeFuzzy(dart.void, [core.int, core.String])]));
-      checkType(dart.bind(smap, 'forEach'),
-          dart.fnTypeFuzzy(dart.void,
-              [dart.fnTypeFuzzy(dart.void,
-                  [core.String, core.String])]), false, true);
-
-      // Tear off of a mixed in method
-      let mapB = new (c.MapBase$(core.int, core.int).new)();
-      checkType(dart.bind(mapB, 'forEach'),
-          dart.fnTypeFuzzy(dart.void, [
-              dart.fnTypeFuzzy(dart.void, [core.int, core.int])]));
-      checkType(dart.bind(mapB, 'forEach'),
-          dart.fnTypeFuzzy(dart.void, [
-              dart.fnTypeFuzzy(dart.void, [core.int, core.String])]),
-                false, true);
-
-      // Tear off of a method with a symbol name
-      let listB = new (c.ListBase$(core.int).new)();
-      // List.add is reified as taking Object
-      checkType(dart.bind(listB, dartx.add),
-                dart.fnTypeFuzzy(dart.void, [core.int]));
-      checkType(dart.bind(listB, dartx.add),
-                dart.fnTypeFuzzy(dart.void, [core.String]), true);
-      checkType(dart.bind(listB, dartx.removeAt),
-                dart.fnTypeFuzzy(dart.void, [core.String]), false);
-
-      // Tear off of a static method
-      checkType(c.ListBase.listToString,
-                dart.fnTypeFuzzy(core.String, [core.List]));
-      checkType(c.ListBase.listToString,
-                dart.fnTypeFuzzy(core.String, [core.String]), false);
-
-      // Tear-off of extension methods on primitives
-      checkType(dart.bind(3.0, dartx.floor),
-                dart.fnTypeFuzzy(core.int, []));
-      checkType(dart.bind(3.0, dartx.floor),
-                dart.fnTypeFuzzy(core.String, []), false);
-      checkType(dart.bind("", dartx.endsWith),
-                dart.fnTypeFuzzy(core.bool, [core.String]));
-      checkType(dart.bind("", dartx.endsWith),
-                dart.fnTypeFuzzy(core.bool, [core.int]), false);
-
-      // Tear off a mixin method
-      class Base {
-        m(x) {return x;}
-      };
-      dart.setSignature(Base, {
-        methods: () => ({
-          m: dart.fnType(core.int, [core.int]),
-        })
-      });
-
-      class M1 {
-        m(x) {return x;}
-      };
-      dart.setSignature(M1, {
-        methods: () => ({
-          m: dart.fnType(core.num, [core.int]),
-        })
-      });
-
-      class M2 {
-        m(x) {return x;}
-      };
-      dart.setSignature(M2, {
-        methods: () => ({
-          m: dart.fnType(core.Object, [core.int]),
-        })
-      });
-
-      class O extends dart.mixin(Base, M1, M2) {}
-      (O.new = function() {}).prototype = O.prototype;
-      dart.setSignature(O, {});
-      var obj = new O.new();
-      var m = dart.bind(obj, 'm');
-      checkType(m, dart.fnTypeFuzzy(core.Object, [core.int]));
-      checkType(m, dart.fnTypeFuzzy(core.int, [core.int]), false);
-
-      // Test inherited signatures
-      class P extends O {
-        m(x) {return x;};
-      };
-      (P.new = function() {}).prototype = P.prototype;
-      dart.setSignature(P, {});
-      var obj = new P.new();
-      var m = dart.bind(obj, 'm');
-      checkType(m, dart.fnTypeFuzzy(core.Object, [core.int]));
-      checkType(m, dart.fnTypeFuzzy(core.int, [core.int]), false);
-    });
-
-    test('Object members', () => {
-      let nullHash = dart.hashCode(null);
-      assert.equal(nullHash, 0);
-      let nullString = dart.toString(null);
-      assert.equal(nullString, 'null');
-
-      let map = Map.new();
-      let mapHash = dart.hashCode(map);
-      checkType(mapHash, core.int);
-      assert.equal(mapHash, map.hashCode);
-
-      let mapString = dart.toString(map);
-      assert.equal(mapString, map.toString());
-      checkType(mapString, core.String);
-
-      let str = "A string";
-      let strHash = dart.hashCode(str);
-      checkType(strHash, core.int);
-
-      let strString = dart.toString(str);
-      checkType(strString, core.String);
-      assert.equal(str, strString);
-
-      let n = 42;
-      let intHash = dart.hashCode(n);
-      checkType(intHash, core.int);
-
-      let intString = dart.toString(n);
-      assert.equal(intString, '42');
-    });
-  });
-
-  suite('subtyping', function() {
-    'use strict';
-
-    let fnTypeFuzzy = dart.fnTypeFuzzy;
-    let fnType = dart.fnType;
-    let typedef = dart.typedef;
-    let isSubtype = dart.isSubtype;
-    let int = core.int;
-    let num = core.num;
-    let dyn = dart.dynamic;
-
-    function always(t1, t2) {
-      assert.equal(isSubtype(t1, t2), true,
-          dart.toString(t1) +
-          " should always be a subtype of " +
-          dart.toString(t2));
-    }
-    function never(t1, t2) {
-      assert.equal(isSubtype(t1, t2), false,
-          dart.toString(t1) +
-          " should never be a subtype of " +
-          dart.toString(t2));
-    }
-    function maybe(t1, t2) {
-      assert.equal(isSubtype(t1, t2), null,
-          dart.toString(t1) +
-          " should maybe be a subtype of " +
-          dart.toString(t2));
-    }
-
-    function always2(t1, t2) {
-      always(t1, t2);
-      always(fnTypeFuzzy(t1, [t2]), fnTypeFuzzy(t2, [t1]));
-    }
-    function never2(t1, t2) {
-      never(t1, t2);
-      maybe(fnTypeFuzzy(t1, [t2]), fnTypeFuzzy(t2, [t1]));
-    }
-    function maybe2(t1, t2) {
-      maybe(t1, t2);
-      maybe(fnTypeFuzzy(t1, [t2]), fnTypeFuzzy(t2, [t1]));
-    }
-
-    function run_test(func1, func2, func2opt, func1extra, func2extra) {
-      always2(func2(int, int), func2(int, int));
-      always2(func2(int, num), func2(int, int));
-      always2(func2(int, int), func2(num, int));
-
-      always2(func2opt(int, int), func2opt(int, int));
-      always2(func2opt(int, num), func2opt(int, int));
-      always2(func2opt(int, int), func2opt(num, int));
-
-      always2(func2opt(int, int), func2(int, int));
-      always2(func2opt(int, num), func2(int, int));
-      always2(func2opt(int, int), func2(num, int));
-
-      always2(func2opt(int, int), func1(int));
-      always2(func2opt(int, num), func1(int));
-      always2(func2opt(int, int), func1(num));
-
-      always2(func2extra(int, int), func2(int, int));
-      always2(func2extra(int, num), func2(int, int));
-      always2(func2extra(int, int), func2(num, int));
-
-      maybe2(func2(int, int), func2(int, num));
-      maybe2(func2(num, int), func2(int, int));
-
-      maybe2(func2opt(num, num), func1(int));
-
-      maybe2(func2opt(int, int), func2opt(int, num));
-      maybe2(func2opt(num, int), func2opt(int, int));
-
-      maybe2(func2opt(int, int), func2(int, num));
-      maybe2(func2opt(num, int), func2(int, int));
-
-      maybe2(func2extra(int, int), func2(int, num));
-      maybe2(func2extra(num, int), func2(int, int));
-
-      never2(func1(int), func2(int, num));
-      never2(func1(num), func2(int, int));
-      never2(func1(num), func2(num, num));
-
-      never2(func2(int, int), func1(int));
-      never2(func2(num, int), func1(int));
-      never2(func2(num, num), func1(num));
-
-      never2(func1(int), func2opt(int, num));
-      never2(func1(num), func2opt(int, int));
-      never2(func1(num), func2opt(num, num));
-
-      never2(func2(int, int), func2opt(int, num));
-      never2(func2(num, int), func2opt(int, int));
-      never2(func2(num, num), func2opt(num, num));
-
-      never2(func1extra(int), func2(int, num));
-      never2(func1extra(num), func2(int, int));
-      never2(func1extra(num), func2(num, num));
-
-      never2(func1extra(int), func2opt(int, num));
-      never2(func1extra(num), func2opt(int, int));
-      never2(func1extra(num), func2opt(num, num));
-
-      never2(func1(int), func1extra(int));
-      never2(func1(num), func1extra(int));
-      never2(func1(num), func1extra(num));
-
-      never2(func2(int, int), func1extra(int));
-      never2(func2(num, int), func1extra(int));
-      never2(func2(num, num), func1extra(num));
-
-      never2(func2(int, int), func2extra(int, int));
-      never2(func2(num, int), func2extra(int, int));
-      never2(func2(num, num), func2extra(num, num));
-    };
-
-    test('basic function types', () => {
-      function func1(S) {
-        return fnTypeFuzzy(S, []);
-      }
-
-      function func2(S, T) {
-        return fnTypeFuzzy(S, [T]);
-      }
-
-      function func2opt(S, T) {
-        return fnTypeFuzzy(S, [], [T]);
-      }
-
-      function func1extra(S) {
-        return fnTypeFuzzy(S, [], {extra: int});
-      }
-
-      function func2extra(S, T) {
-        return fnTypeFuzzy(S, [T], {extra: int});
-      }
-
-      run_test(func1, func2, func2opt, func1extra, func2extra);
-    });
-
-    test('top and bottom types', () => {
-      let FutureOr = async.FutureOr$;
-      let tops = [
-        dart.dynamic,
-        core.Object,
-        dart.void,
-        FutureOr(dart.dynamic),
-        FutureOr(core.Object),
-        FutureOr(dart.void),
-        FutureOr(FutureOr(core.Object)),
-        // ... skip the (infinite) rest of the top types :D
-      ];
-      let bottoms = [dart.bottom, core.Null];
-
-      for (let top of tops) {
-        for (let bottom of bottoms) {
-          always(bottom, top);
-          always(
-              fnType(bottom, [top]),
-              fnType(top, [bottom]));
-        }
-      }
-
-      for (let equalTypes of [tops, bottoms]) {
-        for (let t1 of equalTypes) {
-          for (let t2 of equalTypes) {
-            always(t1, t2);
-            always(t2, t1);
-
-            let t11 = fnType(t1, [t1]);
-            let t22 = fnType(t2, [t2]);
-            always(t11, t22);
-            always(t22, t11);
-          }
-        }
-      }
-    });
-
-    test('basic typedefs', () => {
-      function func1(S) {
-        return dart.typedef('Func1', () => fnTypeFuzzy(S, []))
-      }
-
-      function func2(S, T) {
-        return dart.typedef('Func2', () => fnTypeFuzzy(S, [T]))
-      }
-
-      function func2opt(S, T) {
-        return dart.typedef('Func2', () => fnTypeFuzzy(S, [], [T]))
-      }
-
-      function func1extra(S) {
-        return dart.typedef('Func1', () => fnTypeFuzzy(S, [], {extra: int}))
-      }
-
-      function func2extra(S, T) {
-        return dart.typedef('Func2', () => fnTypeFuzzy(S, [T], {extra: int}))
-      }
-
-      run_test(func1, func2, func2opt, func1extra, func2extra);
-    });
-
-    test('basic generic typedefs', () => {
-      let func1 = dart.generic(
-        (S) => dart.typedef('Func1', () => fnTypeFuzzy(S, [])));
-
-      let func2 = dart.generic(
-        (S, T) => dart.typedef('Func2', () => fnTypeFuzzy(S, [T])));
-
-      let func2opt = dart.generic(
-        (S, T) => dart.typedef('Func2', () => fnTypeFuzzy(S, [], [T])));
-
-      let func1extra = dart.generic(
-        (S) => dart.typedef('Func1', () => fnTypeFuzzy(S, [], {extra: int})));
-
-      let func2extra = dart.generic(
-        (S, T) => dart.typedef('Func2',
-                               () => fnTypeFuzzy(S, [T], {extra: int})));
-
-      run_test(func1, func2, func2opt, func1extra, func2extra);
-    });
-
-    test('fuzzy function types', () => {
-      always(fnTypeFuzzy(int, [int]), fnTypeFuzzy(dyn, [dyn]));
-      always(fnTypeFuzzy(int, [], [int]), fnTypeFuzzy(dyn, [], [dyn]));
-      always(fnTypeFuzzy(int, [], [int]), fnTypeFuzzy(dyn, [dyn]));
-      always(fnTypeFuzzy(int, [], [int]), fnTypeFuzzy(dyn, []));
-      always(fnTypeFuzzy(int, [int], {extra: int}), fnTypeFuzzy(dyn, [dyn]));
-
-      always(fnTypeFuzzy(dyn, [dyn]), fnTypeFuzzy(dyn, [dyn]));
-      always(fnTypeFuzzy(dyn, [], [dyn]), fnTypeFuzzy(dyn, [], [dyn]));
-      always(fnTypeFuzzy(dyn, [], [dyn]), fnTypeFuzzy(dyn, [dyn]));
-      always(fnTypeFuzzy(dyn, [], [dyn]), fnTypeFuzzy(dyn, []));
-      always(fnTypeFuzzy(dyn, [dyn], {extra: dyn}), fnTypeFuzzy(dyn, [dyn]));
-    });
-
-    test('void function types', () => {
-      always(fnTypeFuzzy(int, [int]), fnTypeFuzzy(dart.void, [dyn]));
-      always(fnTypeFuzzy(int, [], [int]), fnTypeFuzzy(dart.void, [], [dyn]));
-      always(fnTypeFuzzy(int, [], [int]), fnTypeFuzzy(dart.void, [dyn]));
-      always(fnTypeFuzzy(int, [], [int]), fnTypeFuzzy(dart.void, []));
-      always(fnTypeFuzzy(int, [int], {extra: int}), fnTypeFuzzy(dart.void, [dyn]));
-
-      always(fnTypeFuzzy(dart.void, [int]), fnTypeFuzzy(dart.void, [dyn]));
-      always(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(dart.void, [], [dyn]));
-      always(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(dart.void, [dyn]));
-      always(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(dart.void, []));
-      always(fnTypeFuzzy(dart.void, [int], {extra: int}), fnTypeFuzzy(dart.void, [dyn]));
-
-      always(fnTypeFuzzy(dyn, [dyn]), fnTypeFuzzy(dart.void, [dyn]));
-      always(fnTypeFuzzy(dyn, [], [dyn]), fnTypeFuzzy(dart.void, [], [dyn]));
-      always(fnTypeFuzzy(dyn, [], [dyn]), fnTypeFuzzy(dart.void, [dyn]));
-      always(fnTypeFuzzy(dyn, [], [dyn]), fnTypeFuzzy(dart.void, []));
-      always(fnTypeFuzzy(dyn, [dyn], {extra: dyn}), fnTypeFuzzy(dart.void, [dyn]));
-
-      always(fnTypeFuzzy(dart.void, [dyn]), fnTypeFuzzy(dart.void, [dyn]));
-      always(fnTypeFuzzy(dart.void, [], [dyn]), fnTypeFuzzy(dart.void, [], [dyn]));
-      always(fnTypeFuzzy(dart.void, [], [dyn]), fnTypeFuzzy(dart.void, [dyn]));
-      always(fnTypeFuzzy(dart.void, [], [dyn]), fnTypeFuzzy(dart.void, []));
-      always(fnTypeFuzzy(dart.void, [dyn], {extra: dyn}), fnTypeFuzzy(dart.void, [dyn]));
-
-      always(fnTypeFuzzy(dart.void, [int]), fnTypeFuzzy(dyn, [dyn]));
-      always(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(dyn, [], [dyn]));
-      always(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(dyn, [dyn]));
-      always(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(dyn, []));
-      always(fnTypeFuzzy(dart.void, [int], {extra: int}), fnTypeFuzzy(dyn, [dyn]));
-
-      never(fnTypeFuzzy(dart.void, [int]), fnTypeFuzzy(int, [dyn]));
-      never(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(int, [], [dyn]));
-      never(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(int, [dyn]));
-      never(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(int, []));
-      never(fnTypeFuzzy(dart.void, [int], {extra: int}), fnTypeFuzzy(int, [dyn]));
-
-      never(fnTypeFuzzy(dart.void, [int]), fnTypeFuzzy(int, [int]));
-      never(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(int, [], [int]));
-      never(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(int, [int]));
-      never(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(int, []));
-      never(fnTypeFuzzy(dart.void, [int], {extra: int}), fnTypeFuzzy(int, [int]));
-    });
-
-    test('higher-order typedef', () => {
-      let Func$ = dart.generic((S, T) =>
-                               dart.typedef('Func', () =>
-                                            fnTypeFuzzy(T, [S])));
-      let Func2$ = dart.generic((R, S, T) =>
-                                dart.typedef('Func2', () =>
-                                             fnTypeFuzzy(T, [Func$(R, S)])));
-
-      maybe(fnTypeFuzzy(int, [fnTypeFuzzy(int, [num])]),
-            fnTypeFuzzy(num, [fnTypeFuzzy(int, [int])]));
-      maybe(fnTypeFuzzy(int, [Func$(num, int)]),
-            fnTypeFuzzy(num, [Func$(int, int)]));
-      maybe(Func2$(num, int, int), Func2$(int, int, num));
-    });
-
-    test('mixed types', () => {
-      let AA$ = dart.generic((T) => {
-        class AA extends core.Object {}
-        (AA.new = function() {}).prototype = AA.prototype;
-        return AA;
-      });
-
-      always(int, dyn);
-      maybe(dyn, int);
-
-      never(fnTypeFuzzy(int, [int]), int);
-
-      never(int, fnTypeFuzzy(int, [int]));
-
-      always(AA$(int), AA$(dyn));
-      maybe(AA$(dyn), AA$(int));
-      never(AA$(core.Object), AA$(int));
-
-      always(AA$(fnTypeFuzzy(int, [int])), AA$(dyn));
-      maybe(AA$(dyn), AA$(fnTypeFuzzy(int, [int])));
-      never(AA$(core.Object), AA$(fnTypeFuzzy(int, [int])));
-
-      always(AA$(fnTypeFuzzy(int, [int])), AA$(fnTypeFuzzy(dyn, [dyn])));
-      maybe(AA$(fnTypeFuzzy(dyn, [dyn])), AA$(fnTypeFuzzy(int, [int])));
-      maybe(AA$(fnTypeFuzzy(core.Object, [core.Object])),
-            AA$(fnTypeFuzzy(int, [int])));
-    });
-  });
-
-  suite('canonicalization', function() {
-    'use strict';
-    let fnTypeFuzzy = dart.fnTypeFuzzy;
-    let fnType = dart.fnType;
-    let typedef = dart.typedef;
-    let generic = dart.generic;
-
-    let Object = core.Object;
-    let String = core.String;
-    let int = core.int;
-    let dynamic = dart.dynamic;
-    let bottom = dart.bottom;
-    let Map = core.Map;
-    let Map$ = core.Map$;
-
-    class A {}
-
-    let AA$ = generic((T, U) => {
-      class AA extends core.Object {}
-      (AA.new = function() {}).prototype = AA.prototype;
-      return AA;
-    });
-    let AA = AA$();
-
-    let Func2 = typedef('Func2', () => fnTypeFuzzy(dynamic, [dynamic, dynamic]));
-
-    let FuncG$ = generic((T, U) => typedef('FuncG', () => fnTypeFuzzy(T, [T, U])))
-    let FuncG = FuncG$();
-
-    test('base types', () => {
-      assert.equal(Object, Object);
-      assert.equal(String, String);
-      assert.equal(dynamic, dynamic);
-    });
-
-    test('class types', () => {
-      assert.equal(A, A);
-    });
-
-    test('generic class types', () => {
-      assert.equal(AA, AA);
-      assert.equal(AA, AA$(dynamic, dynamic));
-      assert.equal(AA$(dynamic, dynamic), AA$(dynamic, dynamic));
-      assert.equal(AA$(AA, Object), AA$(AA, Object));
-      assert.equal(Map, Map);
-      assert.equal(Map$(dynamic, dynamic), Map);
-      assert.equal(Map$(int, Map$(int, int)), Map$(int, Map$(int, int)));
-    });
-
-    test('typedefs', () => {
-      assert.equal(Func2, Func2);
-      assert.equal(FuncG, FuncG$(dynamic, dynamic));
-      assert.equal(FuncG$(dynamic, dynamic), FuncG$(dynamic, dynamic));
-      assert.equal(FuncG$(String, Func2), FuncG$(String, Func2));
-    });
-
-    test('function types', () => {
-      assert.equal(fnTypeFuzzy(dynamic, [dynamic, dynamic]),
-                   fnTypeFuzzy(dynamic, [dynamic, dynamic]))
-
-      assert.notEqual(fnType(dynamic, [dynamic, dynamic]),
-                      fnTypeFuzzy(dynamic, [dynamic, dynamic]))
-
-      assert.equal(fnTypeFuzzy(dynamic, [dynamic, dynamic]),
-                   fnTypeFuzzy(dynamic, [bottom, bottom]))
-
-      assert.equal(fnTypeFuzzy(dynamic, [], [dynamic, dynamic]),
-                   fnTypeFuzzy(dynamic, [], [dynamic, dynamic]))
-
-      assert.notEqual(fnType(dynamic, [], [dynamic, dynamic]),
-                      fnTypeFuzzy(dynamic, [], [dynamic, dynamic]))
-
-      assert.equal(fnTypeFuzzy(dynamic, [], [dynamic, dynamic]),
-                   fnTypeFuzzy(dynamic, [], [bottom, bottom]))
-
-      assert.equal(fnTypeFuzzy(dynamic, [], {extra: dynamic}),
-                   fnTypeFuzzy(dynamic, [], {extra: dynamic}))
-
-      assert.notEqual(fnType(dynamic, [], {extra: dynamic}),
-                      fnTypeFuzzy(dynamic, [], {extra: dynamic}))
-
-      assert.equal(fnTypeFuzzy(dynamic, [], {extra: dynamic}),
-                   fnTypeFuzzy(dynamic, [], {extra: bottom}))
-
-      assert.equal(fnTypeFuzzy(int, [int, int]),
-                   fnTypeFuzzy(int, [int, int]))
-
-      assert.equal(fnTypeFuzzy(int, [], [int, int]),
-                   fnTypeFuzzy(int, [], [int, int]))
-
-      assert.equal(fnTypeFuzzy(int, [int, int], {extra: int}),
-                   fnTypeFuzzy(int, [int, int], {extra: int}))
-
-      assert.equal(fnTypeFuzzy(int, [int, int, int, int, int]),
-                   fnTypeFuzzy(int, [int, int, int, int, int]))
-
-      assert.notEqual(fnTypeFuzzy(int, [int, int, int, int, int]),
-                      fnTypeFuzzy(int, [int, int, int], [int, int]))
-
-      assert.notEqual(fnTypeFuzzy(String, [int, int, int, int, int]),
-                      fnTypeFuzzy(int, [int, int, int, int, int]))
-
-      assert.notEqual(fnTypeFuzzy(String, []),
-                   fnTypeFuzzy(int, []))
-    });
-  });
-
-  suite('primitives', function() {
-    'use strict';
-
-    test('fixed length list', () => {
-      let list = core.List.new(10);
-      list[0] = 42;
-      assert.throws(() => list.add(42));
-    });
-
-    test('toString on ES Symbol', () => {
-      let sym = Symbol('_foobar');
-      assert.equal(dart.toString(sym), 'Symbol(_foobar)');
-    });
-  });
-});
diff --git a/pkg/dev_compiler/test/codegen/async_helper.dart b/pkg/dev_compiler/test/codegen/async_helper.dart
deleted file mode 100644
index 49e33ca..0000000
--- a/pkg/dev_compiler/test/codegen/async_helper.dart
+++ /dev/null
@@ -1,111 +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.
-
-/// This library is used for testing asynchronous tests.
-/// If a test is asynchronous, it needs to notify the testing driver
-/// about this (otherwise tests may get reported as passing [after main()
-/// finished] even if the asynchronous operations fail).
-/// Tests which can't use the unittest framework should use the helper functions
-/// in this library.
-/// This library provides four methods
-///  - asyncStart(): Needs to be called before an asynchronous operation is
-///                  scheduled.
-///  - asyncEnd(): Needs to be called as soon as the asynchronous operation
-///                ended.
-///  - asyncSuccess(_): Variant of asyncEnd useful together with Future.then.
-///  - asyncTest(f()): Helper method that wraps a computation that returns a
-///                    Future with matching calls to asyncStart() and
-///                    asyncSuccess(_).
-/// After the last asyncStart() called was matched with a corresponding
-/// asyncEnd() or asyncSuccess(_) call, the testing driver will be notified that
-/// the tests is done.
-
-library async_helper;
-
-bool _initialized = false;
-
-typedef void _Action0();
-_Action0 _onAsyncEnd;
-
-int _asyncLevel = 0;
-
-Exception _buildException(String msg) {
-  return new Exception('Fatal: $msg. This is most likely a bug in your test.');
-}
-
-/// Implementation method called from language_tests.js.
-/// Registers the callback that will be used to complete the test.
-void asyncTestInitialize(_Action0 callback) {
-  _asyncLevel = 0;
-  _initialized = false;
-  _onAsyncEnd = callback;
-}
-
-/// Implementation method called from language_tests.js.
-/// Returns true if an asyncTest was started.
-bool get asyncTestStarted => _initialized;
-
-/// Call this method before an asynchronous test is created.
-///
-/// If [count] is provided, expect [count] [asyncEnd] calls instead of just one.
-void asyncStart([int count = 1]) {
-  if (count <= 0) return;
-  if (_initialized && _asyncLevel == 0) {
-    throw _buildException('asyncStart() was called even though we are done '
-        'with testing.');
-  }
-  if (!_initialized) {
-    if (_onAsyncEnd == null) {
-      throw _buildException(
-          'asyncStart() was called before asyncTestInitialize()');
-    }
-
-    print('unittest-suite-wait-for-done');
-    _initialized = true;
-  }
-  _asyncLevel += count;
-}
-
-/// Call this after an asynchronous test has ended successfully.
-void asyncEnd() {
-  if (_asyncLevel <= 0) {
-    if (!_initialized) {
-      throw _buildException('asyncEnd() was called before asyncStart().');
-    } else {
-      throw _buildException('asyncEnd() was called more often than '
-          'asyncStart().');
-    }
-  }
-  _asyncLevel--;
-  if (_asyncLevel == 0) {
-    var callback = _onAsyncEnd;
-    _onAsyncEnd = null;
-    callback();
-    print('unittest-suite-success');
-  }
-}
-
-/**
- * Call this after an asynchronous test has ended successfully. This is a helper
- * for calling [asyncEnd].
- *
- * This method intentionally has a signature that matches [:Future.then:] as a
- * convenience for calling [asyncEnd] when a [:Future:] completes without error,
- * like this:
- *
- *     asyncStart();
- *     Future result = test();
- *     result.then(asyncSuccess);
- */
-void asyncSuccess(_) => asyncEnd();
-
-/**
- * Helper method for performing asynchronous tests involving [:Future:].
- *
- * [f] must return a [:Future:] for the test computation.
- */
-void asyncTest(f()) {
-  asyncStart();
-  f().then(asyncSuccess);
-}
diff --git a/pkg/dev_compiler/test/codegen_expected/async_helper.js b/pkg/dev_compiler/test/codegen_expected/async_helper.js
deleted file mode 100644
index d3a0723..0000000
--- a/pkg/dev_compiler/test/codegen_expected/async_helper.js
+++ /dev/null
@@ -1,94 +0,0 @@
-define(['dart_sdk'], function(dart_sdk) {
-  'use strict';
-  const core = dart_sdk.core;
-  const dart = dart_sdk.dart;
-  const dartx = dart_sdk.dartx;
-  const _root = Object.create(null);
-  const async_helper = Object.create(_root);
-  let VoidTovoid = () => (VoidTovoid = dart.constFn(dart.fnTypeFuzzy(dart.void, [])))();
-  let VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.fnTypeFuzzy(dart.dynamic, [])))();
-  let StringToException = () => (StringToException = dart.constFn(dart.fnType(core.Exception, [core.String])))();
-  let FnTovoid = () => (FnTovoid = dart.constFn(dart.fnType(dart.void, [VoidTovoid()])))();
-  let VoidTovoid$ = () => (VoidTovoid$ = dart.constFn(dart.fnType(dart.void, [])))();
-  let dynamicTovoid = () => (dynamicTovoid = dart.constFn(dart.fnType(dart.void, [dart.dynamic])))();
-  let FnTovoid$ = () => (FnTovoid$ = dart.constFn(dart.fnType(dart.void, [VoidTodynamic()])))();
-  dart.defineLazy(async_helper, {
-    get _initialized() {
-      return false;
-    },
-    set _initialized(_) {}
-  });
-  async_helper._Action0 = dart.typedef('_Action0', () => dart.fnTypeFuzzy(dart.void, []));
-  dart.defineLazy(async_helper, {
-    get _onAsyncEnd() {
-      return null;
-    },
-    set _onAsyncEnd(_) {},
-    get _asyncLevel() {
-      return 0;
-    },
-    set _asyncLevel(_) {}
-  });
-  async_helper._buildException = function(msg) {
-    return core.Exception.new(dart.str`Fatal: ${msg}. This is most likely a bug in your test.`);
-  };
-  dart.fn(async_helper._buildException, StringToException());
-  async_helper.asyncTestInitialize = function(callback) {
-    async_helper._asyncLevel = 0;
-    async_helper._initialized = false;
-    async_helper._onAsyncEnd = callback;
-  };
-  dart.fn(async_helper.asyncTestInitialize, FnTovoid());
-  dart.copyProperties(async_helper, {
-    get asyncTestStarted() {
-      return async_helper._initialized;
-    }
-  });
-  async_helper.asyncStart = function() {
-    if (dart.test(async_helper._initialized) && async_helper._asyncLevel === 0) {
-      dart.throw(async_helper._buildException('asyncStart() was called even though we are done ' + 'with testing.'));
-    }
-    if (!dart.test(async_helper._initialized)) {
-      if (async_helper._onAsyncEnd == null) {
-        dart.throw(async_helper._buildException('asyncStart() was called before asyncTestInitialize()'));
-      }
-      core.print('unittest-suite-wait-for-done');
-      async_helper._initialized = true;
-    }
-    async_helper._asyncLevel = dart.notNull(async_helper._asyncLevel) + 1;
-  };
-  dart.fn(async_helper.asyncStart, VoidTovoid$());
-  async_helper.asyncEnd = function() {
-    if (dart.notNull(async_helper._asyncLevel) <= 0) {
-      if (!dart.test(async_helper._initialized)) {
-        dart.throw(async_helper._buildException('asyncEnd() was called before asyncStart().'));
-      } else {
-        dart.throw(async_helper._buildException('asyncEnd() was called more often than ' + 'asyncStart().'));
-      }
-    }
-    async_helper._asyncLevel = dart.notNull(async_helper._asyncLevel) - 1;
-    if (async_helper._asyncLevel === 0) {
-      let callback = async_helper._onAsyncEnd;
-      async_helper._onAsyncEnd = null;
-      callback();
-      core.print('unittest-suite-success');
-    }
-  };
-  dart.fn(async_helper.asyncEnd, VoidTovoid$());
-  async_helper.asyncSuccess = function(_) {
-    return async_helper.asyncEnd();
-  };
-  dart.fn(async_helper.asyncSuccess, dynamicTovoid());
-  async_helper.asyncTest = function(f) {
-    async_helper.asyncStart();
-    dart.dsend(f(), 'then', async_helper.asyncSuccess);
-  };
-  dart.fn(async_helper.asyncTest, FnTovoid$());
-  dart.trackLibraries("async_helper", {
-    "async_helper.dart": async_helper
-  }, null);
-  // Exports:
-  return {
-    async_helper: async_helper
-  };
-});
diff --git a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
index d93083c..0870331 100644
--- a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
@@ -69,7 +69,7 @@
     try {
       var result = await compile(args, compilerState: context.compilerState);
       context.compilerState = result.compilerState;
-      succeeded = result.result;
+      succeeded = result.success;
     } catch (e, s) {
       print('Unhandled exception:');
       print(e);
diff --git a/pkg/dev_compiler/tool/build_pkgs.dart b/pkg/dev_compiler/tool/build_pkgs.dart
index c8b3bf12..57c7e30 100755
--- a/pkg/dev_compiler/tool/build_pkgs.dart
+++ b/pkg/dev_compiler/tool/build_pkgs.dart
@@ -3,13 +3,10 @@
 import 'dart:io';
 
 import 'package:args/args.dart';
-import 'package:front_end/src/api_prototype/compilation_message.dart';
-import 'package:front_end/src/api_prototype/compiler_options.dart';
-import 'package:front_end/src/api_prototype/summary_generator.dart';
 import 'package:path/path.dart' as p;
 
-import 'package:dev_compiler/src/analyzer/command.dart' as analyzer;
-import 'package:dev_compiler/src/kernel/target.dart';
+import 'package:dev_compiler/src/analyzer/command.dart' as dartdevc;
+import 'package:dev_compiler/src/kernel/command.dart' as dartdevk;
 
 final String scriptDirectory = p.dirname(p.fromUri(Platform.script));
 
@@ -27,8 +24,6 @@
 /// packages will be placed in a "pkg" subdirectory of this.
 String outputDirectory;
 
-String get pkgDirectory => p.join(outputDirectory, "pkg");
-
 /// Compiles the packages that the DDC tests use to JS into the given output
 /// directory.
 ///
@@ -70,8 +65,6 @@
   kernelSummary = argResults["kernel-sdk"] as String;
   outputDirectory = argResults["output"] as String;
 
-  new Directory(pkgDirectory).createSync(recursive: true);
-
   // Build leaf packages. These have no other package dependencies.
 
   // Under pkg.
@@ -108,7 +101,6 @@
 
   if (!isTravis) {
     await compileModule('unittest', deps: [
-      'matcher',
       'path',
       'stack_trace'
     ], libs: [
@@ -134,113 +126,36 @@
 /// Compiles a [module] with a single matching ".dart" library and additional
 /// [libs] and [deps] on other modules.
 Future compileModule(String module,
-    {List<String> libs, List<String> deps}) async {
-  if (analyzerSummary != null) compileModuleUsingAnalyzer(module, libs, deps);
-  if (kernelSummary != null) await compileKernelSummary(module, libs, deps);
-}
+    {List<String> libs = const [], List<String> deps = const []}) async {
+  makeArgs(bool kernel) {
+    var pkgDirectory = p.join(outputDirectory, kernel ? 'pkg_kernel' : 'pkg');
+    new Directory(pkgDirectory).createSync(recursive: true);
 
-void compileModuleUsingAnalyzer(
-    String module, List<String> libraries, List<String> dependencies) {
-  var args = [
-    '--dart-sdk-summary=$analyzerSummary',
-    '-o${pkgDirectory}/$module.js'
-  ];
-
-  // There is always a library that matches the module.
-  args.add('package:$module/$module.dart');
-
-  // Add any additional libraries.
-  if (libraries != null) {
-    for (var lib in libraries) {
+    var args = [
+      '--dart-sdk-summary=${kernel ? kernelSummary : analyzerSummary}',
+      '-o${pkgDirectory}/$module.js',
+      'package:$module/$module.dart'
+    ];
+    for (var lib in libs) {
       args.add('package:$module/$lib.dart');
     }
-  }
-
-  // Add summaries for any modules this depends on.
-  if (dependencies != null) {
-    for (var dep in dependencies) {
-      args.add('-s${pkgDirectory}/$dep.sum');
+    for (var dep in deps) {
+      args.add('-s${pkgDirectory}/$dep.${kernel ? "dill" : "sum"}');
     }
-  }
-
-  // TODO(rnystrom): Hack. DDC has its own forked copy of async_helper that
-  // has a couple of differences from pkg/async_helper. We should unfork them,
-  // but I'm not sure how they'll affect the other non-DDC tests. For now, just
-  // use ours.
-  if (module == 'async_helper') {
-    args.add('--url-mapping=package:async_helper/async_helper.dart,' +
-        p.join(scriptDirectory, "../test/codegen/async_helper.dart"));
-  }
-
-  var exitCode = analyzer.compile(args);
-  if (exitCode != 0) exit(exitCode);
-}
-
-Future compileKernelSummary(
-    String module, List<String> libraries, List<String> dependencies) async {
-  var succeeded = true;
-
-  void errorHandler(CompilationMessage error) {
-    if (error.severity == Severity.error) succeeded = false;
-  }
-
-  var options = new CompilerOptions()
-    ..sdkSummary = p.toUri(kernelSummary)
-    ..packagesFileUri = _uriInRepo(".packages")
-    ..strongMode = true
-    ..debugDump = true
-    ..onError = errorHandler
-    ..reportMessages = true
-    ..target = new DevCompilerTarget();
-
-  var inputs = <Uri>[];
-
-  if (module == "async_helper") {
-    // TODO(rnystrom): Hack. DDC has its own forked copy of async_helper that
-    // has a couple of differences from pkg/async_helper. We should unfork them,
-    // but I'm not sure how they'll affect the other non-DDC tests. For now,
-    // just use ours.
-    inputs.add(_uriInRepo("pkg/dev_compiler/test/codegen/async_helper.dart"));
-  } else {
-    // There is always a library that matches the module.
-    inputs.add(Uri.parse("package:$module/$module.dart"));
-
-    // Add any other libraries too.
-    if (libraries != null) {
-      for (var lib in libraries) {
-        inputs.add(Uri.parse("package:$module/$lib.dart"));
-      }
+    if (kernel) {
+      args.add('--summary-input-dir=$pkgDirectory');
     }
+    return args;
   }
 
-  // Add summaries for any modules this depends on.
-  if (dependencies != null) {
-    var uris = <Uri>[];
-
-    for (var dep in dependencies) {
-      uris.add(p.toUri(p.absolute(p.join(pkgDirectory, "$dep.dill"))));
-    }
-
-    options.inputSummaries = uris;
+  if (analyzerSummary != null) {
+    var args = makeArgs(false);
+    var exitCode = dartdevc.compile(args);
+    if (exitCode != 0) exit(exitCode);
   }
-
-  // Compile the summary.
-  var bytes = await summaryFor(inputs, options);
-  var dillFile = new File(p.join(pkgDirectory, "$module.dill"));
-  if (succeeded) {
-    dillFile.writeAsBytesSync(bytes);
-  } else {
-    // Don't leave the previous version of the file on failure.
-    if (dillFile.existsSync()) dillFile.deleteSync();
-
-    stderr.writeln("Could not generate kernel summary for $module.");
-    exit(1);
+  if (kernelSummary != null) {
+    var args = makeArgs(true);
+    var result = await dartdevk.compile(args);
+    if (!result.success) exit(1);
   }
 }
-
-Uri _uriInRepo(String pathInRepo) {
-  // Walk up to repo root.
-  var result = p.join(scriptDirectory, "../../../");
-  result = p.join(result, pathInRepo);
-  return p.toUri(p.absolute(p.normalize(result)));
-}
diff --git a/pkg/dev_compiler/tool/ddb b/pkg/dev_compiler/tool/ddb
index a02b4cf..c6e5ab7 100755
--- a/pkg/dev_compiler/tool/ddb
+++ b/pkg/dev_compiler/tool/ddb
@@ -59,7 +59,11 @@
   ProcessResult runDdc(String command, List<String> args) {
     if (debug) {
       // Use unbuilt script.  This only works from a source checkout.
-      args.insertAll(0, ['--preview-dart-2', '--enable-asserts', path.join(ddcPath, 'bin', '${command}.dart')]);
+      args.insertAll(0, [
+        '--preview-dart-2',
+        '--enable-asserts',
+        path.join(ddcPath, 'bin', '${command}.dart')
+      ]);
       command = dartBinary;
     } else {
       // Use built snapshot.
@@ -86,8 +90,17 @@
       mod = 'amd';
       break;
   }
-  var sdkJsPath = path.join(dartSdk, 'lib', 'dev_compiler', mod);
 
+  String sdkJsPath;
+  if (debug) {
+    var sdkRoot = path.dirname(path.dirname(ddcPath));
+    var buildDir = path.join(sdkRoot, Platform.isMacOS ? 'xcodebuild' : 'out');
+    var genDir = path.join(buildDir, 'ReleaseX64', 'gen', 'utils', 'dartdevc');
+    sdkJsPath = path.join(genDir, kernel ? 'kernel' : 'js', mod);
+  } else {
+    var suffix = kernel ? path.join('kernel', mod) : mod;
+    sdkJsPath = path.join(dartSdk, 'lib', 'dev_compiler', suffix);
+  }
   ProcessResult result;
   if (kernel) {
     var ddcSdk = path.join(dartSdk, 'lib', '_internal', 'ddc_sdk.dill');
diff --git a/pkg/dev_compiler/tool/ddc b/pkg/dev_compiler/tool/ddc
index addb332..937accd 100755
--- a/pkg/dev_compiler/tool/ddc
+++ b/pkg/dev_compiler/tool/ddc
@@ -63,8 +63,6 @@
 BASENAME=$( basename "${1%.*}")
 LIBROOT=$(cd $( dirname "${1%.*}") && pwd)
 
-export NODE_PATH=$GEN_DIR/js/common:$LIBROOT:$NODE_PATH
-
 if [ "$KERNEL" = true ]; then
 
   if [ ! -e $GEN_DIR/kernel/ddc_sdk.dill ]; then
@@ -74,6 +72,8 @@
     exit 1
   fi
 
+  NODE_PATH=$GEN_DIR/kernel/common:$LIBROOT:$NODE_PATH
+
   $SDK_DIR/sdk/bin/dartdevk --modules=node \
       --dart-sdk-summary=$GEN_DIR/kernel/ddc_sdk.dill \
       -o $LIBROOT/$BASENAME.js $*
@@ -86,6 +86,8 @@
     exit 1
   fi
 
+  NODE_PATH=$GEN_DIR/js/common:$LIBROOT:$NODE_PATH
+
   $SDK_DIR/sdk/bin/dartdevc --modules=node \
       --library-root=$LIBROOT --dart-sdk-summary=$GEN_DIR/ddc_sdk.sum \
       -o $LIBROOT/$BASENAME.js $*
diff --git a/pkg/dev_compiler/tool/ddw b/pkg/dev_compiler/tool/ddw
index 4941c00..86ecf9b 100755
--- a/pkg/dev_compiler/tool/ddw
+++ b/pkg/dev_compiler/tool/ddw
@@ -63,8 +63,6 @@
 BASENAME=$( basename "${1%.*}")
 LIBROOT=$(cd $( dirname "${1%.*}") && pwd)
 
-export NODE_PATH=$GEN_DIR/js/common:$LIBROOT:$NODE_PATH
-
 if [ "$KERNEL" = true ]; then
 
   if [ ! -e $GEN_DIR/kernel/ddc_sdk.dill ]; then
@@ -74,6 +72,8 @@
     exit 1
   fi
 
+  NODE_PATH=$GEN_DIR/kernel/common:$LIBROOT:$NODE_PATH
+
   dart -c $SDK_DIR/pkg/dev_compiler/bin/dartdevk.dart --modules=node \
       --dart-sdk-summary=$GEN_DIR/kernel/ddc_sdk.dill \
       -o $LIBROOT/$BASENAME.js $*
@@ -86,6 +86,8 @@
     exit 1
   fi
 
+  NODE_PATH=$GEN_DIR/js/common:$LIBROOT:$NODE_PATH
+
   dart -c $SDK_DIR/pkg/dev_compiler/bin/dartdevc.dart --modules=node \
       --library-root=$LIBROOT --dart-sdk-summary=$GEN_DIR/ddc_sdk.sum \
       -o $LIBROOT/$BASENAME.js $*
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/js/dart2js/js_dart2js.dart b/pkg/dev_compiler/tool/input_sdk/lib/js/dart2js/js_dart2js.dart
index a3de057..8d7ad6e 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/js/dart2js/js_dart2js.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/js/dart2js/js_dart2js.dart
@@ -91,9 +91,9 @@
 
 import 'dart:_js_helper' show Primitives;
 import 'dart:_foreign_helper' show JS;
+import 'dart:_runtime' as dart;
 
-final _global = JS('', 'dart.global');
-final JsObject context = _wrapToDart(_global);
+final JsObject context = _wrapToDart(dart.global_);
 
 /**
  * Proxies a JavaScript object to Dart.
@@ -503,17 +503,13 @@
 // converts a Dart object to a reference to a native JS object
 // which might be a DartObject JS->Dart proxy
 Object _convertToDart(o) {
-  if (JS('bool', '# == null', o) ||
-      JS('bool', 'typeof # == "string"', o) ||
-      JS('bool', 'typeof # == "number"', o) ||
-      JS('bool', 'typeof # == "boolean"', o) ||
-      _isBrowserType(o)) {
+  if (o == null || o is String || o is num || o is bool || _isBrowserType(o)) {
     return o;
-  } else if (JS('bool', '# instanceof Date', o)) {
+  } else if (JS('!', '# instanceof Date', o)) {
     num ms = JS('!', '#.getTime()', o);
     return new DateTime.fromMillisecondsSinceEpoch(ms);
   } else if (o is _DartObject &&
-      JS('bool', 'dart.jsobject != dart.getReifiedType(#)', o)) {
+      !identical(dart.getReifiedType(o), dart.jsobject)) {
     return o._dartObj;
   } else {
     return _wrapToDart(o);
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart
index 163e26c..0dd4e3e 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart
@@ -28,8 +28,8 @@
 
 void _copyMembers(to, from) {
   var names = getOwnNamesAndSymbols(from);
-  for (var i = 0, n = JS('int', '#.length', names); i < n; ++i) {
-    var name = JS('', '#[#]', names, i);
+  for (int i = 0, n = JS('!', '#.length', names); i < n; ++i) {
+    String name = JS('', '#[#]', names, i);
     if (name == 'constructor') continue;
     _copyMember(to, from, name);
   }
@@ -38,14 +38,14 @@
 
 void _copyMember(to, from, name) {
   var desc = getOwnPropertyDescriptor(from, name);
-  if (JS('bool', '# == Symbol.iterator', name)) {
+  if (JS('!', '# == Symbol.iterator', name)) {
     // On native types, Symbol.iterator may already be present.
     // TODO(jmesserly): investigate if we still need this.
     // If so, we need to find a better solution.
     // See https://github.com/dart-lang/sdk/issues/28324
     var existing = getOwnPropertyDescriptor(to, name);
     if (existing != null) {
-      if (JS('bool', '#.writable', existing)) {
+      if (JS('!', '#.writable', existing)) {
         JS('', '#[#] = #.value', to, name, desc);
       }
       return;
@@ -201,18 +201,18 @@
 
 bool isJsInterop(obj) {
   if (obj == null) return false;
-  if (JS('bool', 'typeof # === "function"', obj)) {
+  if (JS('!', 'typeof # === "function"', obj)) {
     // A function is a Dart function if it has runtime type information.
-    return JS('bool', '#[#] == null', obj, _runtimeType);
+    return JS('!', '#[#] == null', obj, _runtimeType);
   }
   // Primitive types are not JS interop types.
-  if (JS('bool', 'typeof # !== "object"', obj)) return false;
+  if (JS('!', 'typeof # !== "object"', obj)) return false;
 
   // Extension types are not considered JS interop types.
   // Note that it is still possible to call typed JS interop methods on
   // extension types but the calls must be statically typed.
-  if (JS('bool', '#[#] != null', obj, _extensionType)) return false;
-  return JS('bool', '!($obj instanceof $Object)');
+  if (JS('!', '#[#] != null', obj, _extensionType)) return false;
+  return JS('!', '!($obj instanceof $Object)');
 }
 
 /// Get the type of a method from a type using the stored signature
@@ -227,7 +227,7 @@
   if (setters != null) {
     var type = JS('', '#[#]', setters, name);
     if (type != null) {
-      if (JS('bool', '# instanceof Array', type)) {
+      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);
@@ -238,7 +238,7 @@
   var fields = getFields(type);
   if (fields != null) {
     var fieldInfo = JS('', '#[#]', fields, name);
-    if (fieldInfo != null && JS('bool', '!#.isFinal', fieldInfo)) {
+    if (fieldInfo != null && JS<bool>('!', '!#.isFinal', fieldInfo)) {
       return JS('', '#.type', fieldInfo);
     }
   }
@@ -285,14 +285,14 @@
 
 _getMembers(type, kind) {
   var sig = JS('', '#[#]', type, kind);
-  return JS('bool', 'typeof # == "function"', sig)
-      ? JS('', '#[#] = #', type, kind, sig())
+  return JS<bool>('!', 'typeof # == "function"', sig)
+      ? JS('', '#[#] = #()', type, kind, sig)
       : sig;
 }
 
 bool _hasMember(type, kind, name) {
   var sig = _getMembers(type, kind);
-  return sig != null && JS('bool', '# in #', name, sig);
+  return sig != null && JS<bool>('!', '# in #', name, sig);
 }
 
 bool hasMethod(type, name) => _hasMember(type, _methodSig, name);
@@ -307,14 +307,14 @@
 /// Install properties in prototype-first order.  Properties / descriptors from
 /// more specific types should overwrite ones from less specific types.
 void _installProperties(jsProto, dartType, installedParent) {
-  if (JS('bool', '# === #', dartType, Object)) {
+  if (JS('!', '# === #', dartType, Object)) {
     _installPropertiesForObject(jsProto);
     return;
   }
   // If the extension methods of the parent have been installed on the parent
   // of [jsProto], the methods will be available via prototype inheritance.
   var dartSupertype = JS('', '#.__proto__', dartType);
-  if (JS('bool', '# !== #', dartSupertype, installedParent)) {
+  if (JS('!', '# !== #', dartSupertype, installedParent)) {
     _installProperties(jsProto, dartSupertype, installedParent);
   }
 
@@ -350,7 +350,7 @@
   var jsProto = JS('', '#.prototype', jsType);
   if (jsProto == null) return;
 
-  if (JS('bool', '# === #', dartExtType, Object)) {
+  if (JS('!', '# === #', dartExtType, Object)) {
     _installPropertiesForGlobalObject(jsProto);
     return;
   }
@@ -359,7 +359,7 @@
       jsProto, dartExtType, JS('', '#[#]', jsProto, _extensionType));
 
   // Mark the JS type's instances so we can easily check for extensions.
-  if (JS('bool', '# !== #', dartExtType, JSFunction)) {
+  if (JS('!', '# !== #', dartExtType, JSFunction)) {
     JS('', '#[#] = #', jsProto, _extensionType, dartExtType);
   }
   JS('', '#[#] = #[#]', jsType, _methodSig, dartExtType, _methodSig);
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
index b0b39e3..115a550 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
@@ -23,22 +23,22 @@
 }
 
 argumentError(value) {
-  if (JS('bool', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
+  if (JS('!', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
   throw new ArgumentError.value(value);
 }
 
 throwUnimplementedError(String message) {
-  if (JS('bool', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
+  if (JS('!', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
   throw new UnimplementedError(message);
 }
 
 assertFailed(message) {
-  if (JS('bool', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
+  if (JS('!', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
   throw new AssertionErrorImpl(message);
 }
 
 throwCyclicInitializationError([Object field]) {
-  if (JS('bool', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
+  if (JS('!', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
   throw new CyclicInitializationError(field);
 }
 
@@ -46,12 +46,12 @@
   // TODO(vsm): Per spec, we should throw an NSM here.  Technically, we ought
   // to thread through method info, but that uglifies the code and can't
   // actually be queried ... it only affects how the error is printed.
-  if (JS('bool', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
+  if (JS('!', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
   throw new NoSuchMethodError(
       null, new Symbol('<Unexpected Null Value>'), null, null, null);
 }
 
-castError(obj, expectedType, [@js_helper.notNull bool isImplicit = false]) {
+castError(obj, expectedType, [@notNull bool isImplicit = false]) {
   var actualType = getReifiedType(obj);
   var message = _castErrorMessage(actualType, expectedType);
   if (JS('!', 'dart.__ignoreAllErrors')) {
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
index 0723a7b..cbeda90 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
@@ -98,7 +98,7 @@
 // implemented by the Object base class as those methods can always be
 // statically resolved.
 dload(obj, field, [mirrors = undefined]) {
-  if (JS('bool', 'typeof # == "function" && # == "call"', obj, field)) {
+  if (JS('!', 'typeof # == "function" && # == "call"', obj, field)) {
     return obj;
   }
   var f = _canonicalMember(obj, field);
@@ -111,7 +111,7 @@
     if (hasMethod(type, f)) return bind(obj, f, null);
 
     // Always allow for JS interop objects.
-    if (!JS('bool', '#', mirrors) && isJsInterop(obj)) {
+    if (!JS<bool>('!', '#', mirrors) && isJsInterop(obj)) {
       return JS('', '#[#]', obj, f);
     }
   }
@@ -143,12 +143,12 @@
   if (f != null) {
     var setterType = getSetterType(getType(obj), f);
     if (setterType != null) {
-      if (JS('bool', '#', mirrors))
+      if (JS('!', '#', mirrors))
         setterType = _stripGenericArguments(setterType);
       return JS('', '#[#] = #._check(#)', obj, f, setterType, value);
     }
     // Always allow for JS interop objects.
-    if (!JS('bool', '#', mirrors) && isJsInterop(obj)) {
+    if (!JS<bool>('!', '#', mirrors) && isJsInterop(obj)) {
       return JS('', '#[#] = #', obj, f, value);
     }
   }
@@ -161,15 +161,15 @@
 /// actuals.
 bool _checkApply(FunctionType type, List actuals, namedActuals) {
   // Check for too few required arguments.
-  var actualsCount = JS('int', '#.length', actuals);
+  int actualsCount = JS('!', '#.length', actuals);
   var required = type.args;
-  var requiredCount = JS('int', '#.length', required);
+  int requiredCount = JS('!', '#.length', required);
   if (actualsCount < requiredCount) return false;
 
   // Check for too many postional arguments.
   var extras = actualsCount - requiredCount;
   var optionals = type.optionals;
-  if (extras > JS('int', '#.length', optionals)) return false;
+  if (extras > JS<int>('!', '#.length', optionals)) return false;
 
   // Check if we have invalid named arguments.
   Iterable names;
@@ -177,7 +177,7 @@
   if (namedActuals != null) {
     names = getOwnPropertyNames(namedActuals);
     for (var name in names) {
-      if (!JS('bool', '#.hasOwnProperty(#)', named, name)) return false;
+      if (!JS('!', '#.hasOwnProperty(#)', named, name)) return false;
     }
   }
   // Now that we know the signature matches, we can perform type checks.
@@ -222,17 +222,19 @@
   })()''');
 
 Symbol _dartSymbol(name) {
-  return (JS('bool', 'typeof # === "symbol"', name))
+  return (JS<bool>('!', 'typeof # === "symbol"', name))
       ? JS('Symbol', '#(new #.new(#, #))', const_, PrivateSymbol,
           _toSymbolName(name), name)
-      : JS('Symbol', '#(#.new(#))', const_, Symbol, _toDisplayName(name));
+      : JS('Symbol', '#(new #.new(#))', const_, internal.Symbol,
+          _toDisplayName(name));
 }
 
 Symbol _setterSymbol(name) {
-  return (JS('bool', 'typeof # === "symbol"', name))
+  return (JS<bool>('!', 'typeof # === "symbol"', name))
       ? JS('Symbol', '#(new #.new(# + "=", #))', const_, PrivateSymbol,
           _toSymbolName(name), name)
-      : JS('Symbol', '#(#.new(# + "="))', const_, Symbol, _toDisplayName(name));
+      : JS('Symbol', '#(new #.new(# + "="))', const_, internal.Symbol,
+          _toDisplayName(name));
 }
 
 _checkAndCall(f, ftype, obj, typeArgs, args, named, displayName) =>
@@ -358,7 +360,7 @@
 
 /// Shared code for dsend, dindex, and dsetindex.
 callMethod(obj, name, typeArgs, args, named, displayName) {
-  if (JS('bool', 'typeof # == "function" && # == "call"', obj, name)) {
+  if (JS('!', 'typeof # == "function" && # == "call"', obj, name)) {
     return dgcall(obj, typeArgs, args, named);
   }
   var symbol = _canonicalMember(obj, name);
@@ -434,21 +436,22 @@
   });
 })()''');
 
+@notNull
 @JSExportName('is')
 bool instanceOf(obj, type) {
   if (obj == null) {
-    return JS('bool', '# == # || #', type, Null, _isTop(type));
+    return JS('!', '# == # || #', type, Null, _isTop(type));
   }
-  return JS('#', '!!#', isSubtype(getReifiedType(obj), type));
+  return JS('!', '!!#', isSubtype(getReifiedType(obj), type));
 }
 
 @JSExportName('as')
-cast(obj, type, @js_helper.notNull bool isImplicit) {
+cast(obj, type, @notNull bool isImplicit) {
   if (obj == null) return obj;
   var actual = getReifiedType(obj);
   var result = isSubtype(actual, type);
   if (JS(
-      'bool',
+      '!',
       '# === true || # === null && # && '
       'dart.__ignoreWhitelistedErrors && #(#, #)',
       result,
@@ -484,15 +487,21 @@
 asInt(obj) {
   if (obj == null) return null;
 
-  if (JS('bool', 'Math.floor(#) != #', obj, obj)) {
+  if (JS('!', 'Math.floor(#) != #', obj, obj)) {
     castError(obj, JS('', '#', int), false);
   }
   return obj;
 }
 
 /// Checks that `x` is not null or undefined.
-// TODO(jmesserly): should we inline this?
-notNull(x) {
+//
+// TODO(jmesserly): inline this, either by generating it as a function into
+// the module, or via some other pattern such as:
+//
+//     <expr> || nullErr()
+//     (t0 = <expr>) != null ? t0 : nullErr()
+@JSExportName('notNull')
+_notNull(x) {
   if (x == null) throwNullValueError();
   return x;
 }
@@ -521,7 +530,7 @@
 }
 
 bool dassert(value) {
-  if (JS('bool', '# != null && #[#] instanceof #', value, value, _runtimeType,
+  if (JS('!', '# != null && #[#] instanceof #', value, value, _runtimeType,
       AbstractFunctionType)) {
     value = dcall(value, []);
   }
@@ -536,8 +545,8 @@
 const _maxErrorCache = 10;
 
 bool _isJsError(exception) {
-  return JS('bool', '#.Error != null && # instanceof #.Error', global_,
-      exception, global_);
+  return JS('!', '#.Error != null && # instanceof #.Error', global_, exception,
+      global_);
 }
 
 // Record/return the JS error for an exception.  If an error was already
@@ -546,7 +555,7 @@
   if (_isJsError(exception)) return exception;
 
   var useExpando =
-      exception != null && JS('bool', 'typeof # == "object"', exception);
+      exception != null && JS<bool>('!', 'typeof # == "object"', exception);
   var error;
   if (useExpando) {
     error = JS('', '#[#]', exception, _error);
@@ -728,29 +737,30 @@
   // function minimal.
   // This pattern resulted from performance testing; it found that dispatching
   // was the fastest solution, even for primitive types.
-  return JS('bool', '# == null ? # == null : #[#](#)', x, y, x,
+  return JS('!', '# == null ? # == null : #[#](#)', x, y, x,
       extensionSymbol('_equals'), y);
 }
 
 int hashCode(obj) {
-  return obj == null ? 0 : JS('int', '#[#]', obj, extensionSymbol('hashCode'));
-}
-
-hashKey(k) {
-  if (k == null) return 0;
-  switch (JS('String', 'typeof #', k)) {
-    case "object":
-    case "function":
-      return JS('int', '#[#] & 0x3ffffff', k, extensionSymbol('hashCode'));
-  }
-  // For primitive types we can store the key directly in an ES6 Map.
-  return k;
+  return obj == null ? 0 : JS('!', '#[#]', obj, extensionSymbol('hashCode'));
 }
 
 @JSExportName('toString')
 String _toString(obj) {
   if (obj == null) return "null";
-  return JS('String', '#[#]()', obj, extensionSymbol('toString'));
+  if (obj is String) return obj;
+  return JS('!', '#[#]()', obj, extensionSymbol('toString'));
+}
+
+/// Converts to a non-null [String], equivalent to
+/// `dart.notNull(dart.toString(obj))`.
+///
+/// This is commonly used in string interpolation.
+@notNull
+String str(obj) {
+  if (obj == null) return "null";
+  if (obj is String) return obj;
+  return _notNull(JS('!', '#[#]()', obj, extensionSymbol('toString')));
 }
 
 // TODO(jmesserly): is the argument type verified statically?
@@ -761,7 +771,7 @@
 
 /// The default implementation of `noSuchMethod` to match `Object.noSuchMethod`.
 defaultNoSuchMethod(obj, Invocation i) {
-  if (JS('bool', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
+  if (JS('!', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
   throw new NoSuchMethodError.withInvocation(obj, i);
 }
 
@@ -769,17 +779,6 @@
   return obj == null ? Null : JS('', '#[dartx.runtimeType]', obj);
 }
 
-/// Implements Dart's interpolated strings as ES2015 tagged template literals.
-///
-/// For example: dart.str`hello ${name}`
-String str(strings, @rest values) => JS('', '''(() => {
-  let s = $strings[0];
-  for (let i = 0, len = $values.length; i < len; ) {
-    s += $notNull($_toString($values[i])) + $strings[++i];
-  }
-  return s;
-})()''');
-
 final identityHashCode_ = JS('', 'Symbol("_identityHashCode")');
 
 /// Adapts a Dart `get iterator` into a JS `[Symbol.iterator]`.
@@ -801,14 +800,14 @@
 
 _canonicalMember(obj, name) {
   // Private names are symbols and are already canonical.
-  if (JS('bool', 'typeof # === "symbol"', name)) return name;
+  if (JS('!', 'typeof # === "symbol"', name)) return name;
 
-  if (obj != null && JS('bool', '#[#] != null', obj, _extensionType)) {
+  if (obj != null && JS<bool>('!', '#[#] != null', obj, _extensionType)) {
     return JS('', 'dartx.#', name);
   }
 
   // Check for certain names that we can't use in JS
-  if (JS('bool', '# == "constructor" || # == "prototype"', name, name)) {
+  if (JS('!', '# == "constructor" || # == "prototype"', name, name)) {
     JS('', '# = "+" + #', name, name);
   }
   return name;
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart
index 874a3fa..95af629 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart
@@ -85,10 +85,10 @@
 /// different from the user-visible Type object returned by calling
 /// `runtimeType` on some Dart object.
 getReifiedType(obj) {
-  switch (JS('String', 'typeof #', obj)) {
+  switch (JS<String>('!', 'typeof #', obj)) {
     case "object":
       if (obj == null) return JS('', '#', Null);
-      if (JS('bool', '# instanceof #', obj, Object)) {
+      if (JS('!', '# instanceof #', obj, Object)) {
         return JS('', '#.constructor', obj);
       }
       var result = JS('', '#[#]', obj, _extensionType);
@@ -118,7 +118,7 @@
 Type wrapType(type) {
   // 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('bool', '#.hasOwnProperty(#)', type, _typeObject)) {
+  if (JS('!', '#.hasOwnProperty(#)', type, _typeObject)) {
     return JS('', '#[#]', type, _typeObject);
   }
   return JS('Type', '#[#] = #', type, _typeObject, new WrappedType(type));
@@ -141,7 +141,7 @@
 }
 
 String getSourceMap(module) {
-  return JS('String', '#.get(#)', _loadedSourceMaps, module);
+  return JS<String>('!', '#.get(#)', _loadedSourceMaps, module);
 }
 
 /// Return all library objects in the specified module.
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
index 15b4326..fd5a32b 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
@@ -10,6 +10,7 @@
 
 import 'dart:_foreign_helper' show JS, JSExportName, rest, spread;
 import 'dart:_interceptors' show JSArray, jsNull, JSFunction;
+import 'dart:_internal' as internal show Symbol;
 import 'dart:_js_helper'
     show
         AssertionErrorImpl,
@@ -22,8 +23,8 @@
         ImmutableMap,
         PrivateSymbol,
         ReifyFunctionTypes,
-        NoReifyGeneric;
-import 'dart:_js_helper' as js_helper show notNull;
+        NoReifyGeneric,
+        notNull;
 import 'dart:_debugger' show trackCall;
 
 export 'dart:_debugger'
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
index 2d0df1b..8ac9b89 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
@@ -79,7 +79,7 @@
   check_T(object) => object;
 }
 
-bool _isJsObject(obj) => JS('bool', '# === #', getReifiedType(obj), jsobject);
+bool _isJsObject(obj) => JS('!', '# === #', getReifiedType(obj), jsobject);
 
 class LazyJSType extends TypeRep {
   final Function() _rawJSType;
@@ -106,7 +106,7 @@
 
   bool isRawType(obj) {
     var raw = _raw();
-    if (raw != null) return JS('bool', '# instanceof #', obj, raw);
+    if (raw != null) return JS('!', '# instanceof #', obj, raw);
     // Treat as anonymous: return true for any JS object.
     return _isJsObject(obj);
   }
@@ -302,7 +302,7 @@
     // identical function types that don't canonicalize
     // to the same object since we won't fall into this
     // fast path.
-    if (extra == null && JS('bool', '#.length < 3', args)) {
+    if (extra == null && JS<bool>('!', '#.length < 3', args)) {
       return _createSmall(returnType, args);
     }
     args = _canonicalizeArray(args, _fnTypeArrayArgMap);
@@ -311,7 +311,7 @@
     if (extra == null) {
       keys = [returnType, args];
       create = () => new FunctionType(returnType, args, [], JS('', '{}'));
-    } else if (JS('bool', '# instanceof Array', extra)) {
+    } else if (JS('!', '# instanceof Array', extra)) {
       var optionals =
           _canonicalizeArray(JS('', '#', extra), _fnTypeArrayArgMap);
       keys = [returnType, args, optionals];
@@ -327,9 +327,9 @@
 
   List _process(List array) {
     var result = [];
-    for (var i = 0; JS('bool', '# < #.length', i, array); ++i) {
+    for (var i = 0; JS<bool>('!', '# < #.length', i, array); ++i) {
       var arg = JS('', '#[#]', array, i);
-      if (JS('bool', '# instanceof Array', arg)) {
+      if (JS('!', '# instanceof Array', arg)) {
         JS('', '#.push(#.slice(1))', metadata, arg);
         JS('', '#.push(#[0])', result, arg);
       } else {
@@ -360,7 +360,7 @@
     var result = <String, Object>{};
     var names = getOwnPropertyNames(named);
     JS('', '#.sort()', names);
-    for (var i = 0; JS('bool', '# < #.length', i, names); ++i) {
+    for (var i = 0; JS<bool>('!', '# < #.length', i, names); ++i) {
       String name = JS('!', '#[#]', names, i);
       result[name] = JS('', '#[#]', named, name);
     }
@@ -371,28 +371,28 @@
     if (_stringValue != null) return _stringValue;
 
     var buffer = '(';
-    for (var i = 0; JS('bool', '# < #.length', i, args); ++i) {
+    for (var i = 0; JS<bool>('!', '# < #.length', i, args); ++i) {
       if (i > 0) {
         buffer += ', ';
       }
       buffer += typeName(JS('', '#[#]', args, i));
     }
-    if (JS('bool', '#.length > 0', optionals)) {
-      if (JS('bool', '#.length > 0', args)) buffer += ', ';
+    if (JS('!', '#.length > 0', optionals)) {
+      if (JS('!', '#.length > 0', args)) buffer += ', ';
       buffer += '[';
-      for (var i = 0; JS('bool', '# < #.length', i, optionals); ++i) {
+      for (var i = 0; JS<bool>('!', '# < #.length', i, optionals); ++i) {
         if (i > 0) {
           buffer += ', ';
         }
         buffer += typeName(JS('', '#[#]', optionals, i));
       }
       buffer += ']';
-    } else if (JS('bool', 'Object.keys(#).length > 0', named)) {
-      if (JS('bool', '#.length > 0', args)) buffer += ', ';
+    } else if (JS('!', 'Object.keys(#).length > 0', named)) {
+      if (JS('!', '#.length > 0', args)) buffer += ', ';
       buffer += '{';
       var names = getOwnPropertyNames(named);
       JS('', '#.sort()', names);
-      for (var i = 0; JS('bool', '# < #.length', i, names); ++i) {
+      for (var i = 0; JS<bool>('!', '# < #.length', i, names); ++i) {
         if (i > 0) {
           buffer += ', ';
         }
@@ -410,11 +410,11 @@
 
   @JSExportName('is')
   bool is_T(obj) {
-    if (JS('bool', 'typeof # == "function"', obj)) {
+    if (JS('!', 'typeof # == "function"', obj)) {
       var actual = JS('', '#[#]', obj, _runtimeType);
       // If there's no actual type, it's a JS function.
       // Allow them to subtype all Dart function types.
-      return JS('bool', '# == null || !!#', actual, isSubtype(actual, this));
+      return JS('!', '# == null || !!#', actual, isSubtype(actual, this));
     }
     return false;
   }
@@ -427,9 +427,9 @@
         }))()''');
 
   @JSExportName('as')
-  as_T(obj, [@js_helper.notNull bool isImplicit = false]) {
+  as_T(obj, [@notNull bool isImplicit = false]) {
     if (obj == null) return obj;
-    if (JS('bool', 'typeof # == "function"', obj)) {
+    if (JS('!', 'typeof # == "function"', obj)) {
       var actual = JS('', '#[#]', obj, _runtimeType);
       // If there's no actual type, it's a JS function.
       // Allow them to subtype all Dart function types.
@@ -466,14 +466,14 @@
     for (int i = 0, n = JS('!', '#.length', typeArgs); i < n; ++i) {
       if (i > 0) result += ', ';
       var typeArg = JS('', '#[#]', typeArgs, i);
-      if (JS('bool', '# !== #', typeArg, _dynamic)) allDynamic = false;
+      if (JS('!', '# !== #', typeArg, _dynamic)) allDynamic = false;
       result += typeName(typeArg);
     }
     result += '>';
     return allDynamic ? name : result;
   }
 
-  String get name => JS('String', '#', _name);
+  String get name => JS('!', '#', _name);
 
   AbstractFunctionType get functionType {
     var ft = _functionType;
@@ -507,7 +507,7 @@
 
   GenericFunctionType(instantiateTypeParts, this._instantiateTypeBounds)
       : _instantiateTypeParts = instantiateTypeParts,
-        formalCount = JS('int', '#.length', instantiateTypeParts);
+        formalCount = JS('!', '#.length', instantiateTypeParts);
 
   List<TypeVariable> get typeFormals {
     if (_typeFormals != null) return _typeFormals;
@@ -548,7 +548,7 @@
       if (i != 0) s += ", ";
       s += JS<String>('!', '#[#].name', typeFormals, i);
       var bound = typeBounds[i];
-      if (JS('bool', '# !== # && # !== #', bound, dynamic, bound, Object)) {
+      if (JS('!', '# !== # && # !== #', bound, dynamic, bound, Object)) {
         s += " extends $bound";
       }
     }
@@ -635,24 +635,25 @@
     return defaults;
   }
 
+  @notNull
   @JSExportName('is')
   bool is_T(obj) {
-    if (JS('bool', 'typeof # == "function"', obj)) {
+    if (JS('!', 'typeof # == "function"', obj)) {
       var actual = JS('', '#[#]', obj, _runtimeType);
-      return JS('bool', '# != null && !!#', actual, isSubtype(actual, this));
+      return JS('!', '# != null && !!#', actual, isSubtype(actual, this));
     }
     return false;
   }
 
   @JSExportName('as')
   as_T(obj) {
-    if (obj == null || JS('bool', '#', is_T(obj))) return obj;
+    if (obj == null || is_T(obj)) return obj;
     return castError(obj, this, false);
   }
 
   @JSExportName('_check')
   check_T(obj) {
-    if (obj == null || JS('bool', '#', is_T(obj))) return obj;
+    if (obj == null || is_T(obj)) return obj;
     return castError(obj, this, true);
   }
 }
@@ -715,7 +716,7 @@
 bool isType(obj) => JS('', '#[#] === #', obj, _runtimeType, Type);
 
 void checkTypeBound(type, bound, name) {
-  if (JS('bool', '#', isSubtype(type, bound))) return;
+  if (JS('!', '#', isSubtype(type, bound))) return;
 
   throwTypeError('type `$type` does not extend `$bound`'
       ' of `$name`.');
@@ -835,12 +836,12 @@
   // code generator happy though.
   var map;
   bool result;
-  if (JS('bool', '!#.hasOwnProperty(#)', t1, _subtypeCache)) {
+  if (JS('!', '!#.hasOwnProperty(#)', t1, _subtypeCache)) {
     JS('', '#[#] = # = new Map()', t1, _subtypeCache, map);
   } else {
     map = JS('', '#[#]', t1, _subtypeCache);
     result = JS('bool|Null', '#.get(#)', map, t2);
-    if (JS('bool', '# !== void 0', result)) return result;
+    if (JS('!', '# !== void 0', result)) return result;
   }
   result =
       JS('bool|Null', '# === # || #(#, #, true)', t1, t2, _isSubtype, t1, t2);
@@ -850,13 +851,15 @@
 
 final _subtypeCache = JS('', 'Symbol("_subtypeCache")');
 
-_isBottom(type) => JS('bool', '# == # || # == #', type, bottom, type, Null);
+@notNull
+bool _isBottom(type) => JS('!', '# == # || # == #', type, bottom, type, Null);
 
-_isTop(type) {
+@notNull
+bool _isTop(type) {
   if (_isFutureOr(type)) {
     return _isTop(JS('', '#[0]', getGenericArgs(type)));
   }
-  return JS('bool', '# == # || # == # || # == #', type, Object, type, dynamic,
+  return JS('!', '# == # || # == # || # == #', type, Object, type, dynamic,
       type, void_);
 }
 
@@ -979,7 +982,7 @@
   return ${_isFunctionSubtype(t1, t2, isCovariant)};
 })()''');
 
-_isInterfaceSubtype(t1, t2, isCovariant) => JS('', '''(() => {
+bool _isInterfaceSubtype(t1, t2, isCovariant) => JS('', '''(() => {
   // We support Dart's covariant generics with the caveat that we do not
   // substitute bottom for dynamic in subtyping rules.
   // I.e., given T1, ..., Tn where at least one Ti != dynamic we disallow:
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart
index 87b3cbb..8e3b738 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart
@@ -39,13 +39,13 @@
 /// This error indicates a strong mode specific failure, other than a type
 /// assertion failure (TypeError) or CastError.
 void throwTypeError(String message) {
-  if (JS('bool', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
+  if (JS('!', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
   throw new TypeErrorImpl(message);
 }
 
 /// This error indicates a bug in the runtime or the compiler.
 void throwInternalError(String message) {
-  if (JS('bool', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
+  if (JS('!', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
   JS('', 'throw Error(#)', message);
 }
 
@@ -103,14 +103,14 @@
 
 copyProperty(to, from, name) {
   var desc = getOwnPropertyDescriptor(from, name);
-  if (JS('bool', '# == Symbol.iterator', name)) {
+  if (JS('!', '# == Symbol.iterator', name)) {
     // On native types, Symbol.iterator may already be present.
     // TODO(jmesserly): investigate if we still need this.
     // If so, we need to find a better solution.
     // See https://github.com/dart-lang/sdk/issues/28324
     var existing = getOwnPropertyDescriptor(to, name);
     if (existing != null) {
-      if (JS('bool', '#.writable', existing)) {
+      if (JS('!', '#.writable', existing)) {
         JS('', '#[#] = #.value', to, name, desc);
       }
       return;
diff --git a/pkg/dev_compiler/tool/input_sdk/private/debugger.dart b/pkg/dev_compiler/tool/input_sdk/private/debugger.dart
index 2d9982b..7b68c31 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/debugger.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/debugger.dart
@@ -918,15 +918,14 @@
 /// Raw JS stack traces are used if $dartStackTraceUtility has not been
 /// specified.
 StackTraceMapper get stackTraceMapper {
-  var _util = JS('', r'dart.global.$dartStackTraceUtility');
-  return _util != null ? JS('StackTraceMapper', '#.mapper', _util) : null;
+  var _util = JS('', r'#.$dartStackTraceUtility', dart.global_);
+  return _util != null ? JS('!', '#.mapper', _util) : null;
 }
 
 /// This entry point is automatically invoked by the code generated by
 /// Dart Dev Compiler
 registerDevtoolsFormatter() {
-  var formatters = [_devtoolsFormatter];
-  JS('', 'dart.global.devtoolsFormatters = #', formatters);
+  JS('', '#.devtoolsFormatters = [#]', dart.global_, _devtoolsFormatter);
 }
 
 // Expose these methods here to facilitate writing debugger tests.
diff --git a/pkg/dev_compiler/tool/kernel_sdk.dart b/pkg/dev_compiler/tool/kernel_sdk.dart
index 38e9e65..ae5273a 100755
--- a/pkg/dev_compiler/tool/kernel_sdk.dart
+++ b/pkg/dev_compiler/tool/kernel_sdk.dart
@@ -22,10 +22,18 @@
   var parserOptions = parser.parse(args);
   var rest = parserOptions.rest;
 
-  Directory.current = path.dirname(path.dirname(path.fromUri(Platform.script)));
+  var ddcPath = path.dirname(path.dirname(path.fromUri(Platform.script)));
+  Directory.current = ddcPath;
 
-  var outputPath =
-      path.absolute(rest.length > 0 ? rest[0] : 'gen/sdk/kernel/ddc_sdk.dill');
+  String outputPath;
+  if (rest.isNotEmpty) {
+    outputPath = path.absolute(rest[0]);
+  } else {
+    var sdkRoot = path.absolute(path.dirname(path.dirname(ddcPath)));
+    var buildDir = path.join(sdkRoot, Platform.isMacOS ? 'xcodebuild' : 'out');
+    var genDir = path.join(buildDir, 'ReleaseX64', 'gen', 'utils', 'dartdevc');
+    outputPath = path.join(genDir, 'kernel', 'ddc_sdk.dill');
+  }
 
   var inputPath = path.absolute('tool/input_sdk');
   var target = new DevCompilerTarget();
diff --git a/pkg/dev_compiler/tool/run.js b/pkg/dev_compiler/tool/run.js
deleted file mode 100644
index ec9eb24..0000000
--- a/pkg/dev_compiler/tool/run.js
+++ /dev/null
@@ -1,90 +0,0 @@
-// 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.
-
-/// This is a utility to run and debug an individual DDC compiled test.
-/// Tests can be run with either node or devtool (a Chrome-based utility with
-/// DOM APIs and developer tools support).
-///
-/// Install devtool via:
-/// > npm install -g devtool
-///
-/// Run via:
-/// > devtool tool/run.js -- corelib_2/apply2_test
-/// or
-/// > node tool/run.js corelib_2/apply2_test
-///
-/// See TODO below on async / unittest support. 
-
-var args = process.argv.slice(2);
-if (args.length != 1) {
-  throw new Error("Usage: devtool tool/run.js <test-module-name>");
-}
-var test = args[0];
-
-var requirejs = require('requirejs');
-var ddcdir = __dirname + '/../';
-requirejs.config({
-  baseUrl: ddcdir + 'gen/codegen_output',
-  paths: {
-    dart_sdk: ddcdir + 'lib/js/amd/dart_sdk',
-    async_helper: ddcdir + 'gen/codegen_output/pkg/async_helper',
-    expect: ddcdir + 'gen/codegen_output/pkg/expect',
-    js: ddcdir + 'gen/codegen_output/pkg/js',
-    matcher: ddcdir + 'gen/codegen_output/pkg/matcher',
-    minitest: ddcdir + 'gen/codegen_output/pkg/minitest',
-    path: ddcdir + 'gen/codegen_output/pkg/path',
-    stack_trace: ddcdir + 'gen/codegen_output/pkg/stack_trace',
-    unittest: ddcdir + 'gen/codegen_output/pkg/unittest',
-  }
-});
-
-// TODO(vsm): Factor out test framework code in test/browser/language_tests.js
-// and use here.  Async tests and unittests won't work without it.
-var sdk = requirejs('dart_sdk');
-sdk.dart.ignoreWhitelistedErrors(false);
-
-let negative = /negative_test/.test(test);
-function finish(e) {
-  if (negative) {
-    if (e) {
-      e = null;
-    } else {
-      e = new Error("test marked as 'negative' but did not throw");
-    }
-  }
-  if (e) {
-    console.log('Test ' + test + ' failed:\n' + e.toString());
-    sdk.dart.stackPrint(e);
-  } else {
-    console.log('Test ' + test + ' passed.');
-  }
-}
-
-sdk.dart.ignoreWhitelistedErrors(false);
-sdk._isolate_helper.startRootIsolate(() => {}, []);
-// Make it easier to debug test failures and required for formatter test that
-// assumes custom formatters are enabled.
-sdk._debugger.registerDevtoolsFormatter();
-
-var async_helper = requirejs('async_helper').async_helper;
-async_helper.asyncTestInitialize(finish);
-
-var module = requirejs(test);
-var lib = test.split('/').slice(-1)[0];
-try {
-  if (module[lib]._expectRuntimeError) negative = true;
-  var result = module[lib].main();
-  // async_helper tests call finish directly - call here for all other
-  // tests.
-  if (!async_helper.asyncTestStarted) {
-    if (!result || !(sdk.async.Future.is(result))) {
-      finish();
-    } else {
-      // Wait iff result is a future
-      result.then(sdk.dart.dynamic)(() => finish(), { onError: (e) => finish(e) });
-    }
-  }
-} catch (e) {
-  finish(e);
-}
diff --git a/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
index 49bcf07..b266feb 100644
--- a/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
@@ -37,17 +37,17 @@
     buffer.write("(");
     if (formals != null) {
       bool isFirst = true;
-      for (TypeBuilder t in formals) {
+      for (dynamic t in formals) {
         if (!isFirst) {
           buffer.write(", ");
         } else {
           isFirst = false;
         }
-        buffer.write(t.fullNameForErrors);
+        buffer.write(t?.fullNameForErrors);
       }
     }
     buffer.write(") -> ");
-    buffer.write(returnType.fullNameForErrors);
+    buffer.write(returnType?.fullNameForErrors);
     return buffer;
   }
 
diff --git a/pkg/front_end/lib/src/fasta/compiler_context.dart b/pkg/front_end/lib/src/fasta/compiler_context.dart
index 1795c7e..2eda950 100644
--- a/pkg/front_end/lib/src/fasta/compiler_context.dart
+++ b/pkg/front_end/lib/src/fasta/compiler_context.dart
@@ -4,7 +4,7 @@
 
 library fasta.compiler_context;
 
-import 'dart:async' show Zone, runZoned;
+import 'dart:async' show Future, Zone, runZoned;
 
 import 'package:kernel/ast.dart' show Source;
 
@@ -101,25 +101,23 @@
 
   /// Perform [action] in a [Zone] where [this] will be available as
   /// `CompilerContext.current`.
-  T runInContext<T>(T action(CompilerContext c)) {
-    try {
-      return runZoned(() => action(this),
-          zoneValues: {compilerContextKey: this});
-    } finally {
-      clear();
-    }
+  Future<T> runInContext<T>(Future<T> action(CompilerContext c)) {
+    return runZoned(
+        () => new Future<T>.sync(() => action(this)).whenComplete(clear),
+        zoneValues: {compilerContextKey: this});
   }
 
   /// Perform [action] in a [Zone] where [options] will be available as
   /// `CompilerContext.current.options`.
-  static T runWithOptions<T>(
-      ProcessedOptions options, T action(CompilerContext c)) {
+  static Future<T> runWithOptions<T>(
+      ProcessedOptions options, Future<T> action(CompilerContext c)) {
     return new CompilerContext(options).runInContext(action);
   }
 
-  static T runWithDefaultOptions<T>(T action(CompilerContext c)) {
-    var options = new ProcessedOptions(new CompilerOptions());
-    return new CompilerContext(options).runInContext(action);
+  static Future<T> runWithDefaultOptions<T>(
+      Future<T> action(CompilerContext c)) {
+    return new CompilerContext(new ProcessedOptions(new CompilerOptions()))
+        .runInContext(action);
   }
 
   static bool get enableColors {
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
index 1f491c2..a9ab933 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -1056,6 +1056,38 @@
     message: r"""Constructors can't have type parameters.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeConstructorWithWrongName = messageConstructorWithWrongName;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageConstructorWithWrongName = const MessageCode(
+    "ConstructorWithWrongName",
+    analyzerCode: "INVALID_CONSTRUCTOR_NAME",
+    dart2jsCode: "*fatal*",
+    severity: Severity.error,
+    message:
+        r"""The name of a constructor must match the name of the enclosing class.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+    templateConstructorWithWrongNameContext =
+    const Template<Message Function(String name)>(
+        messageTemplate: r"""The name of the enclosing class is '#name'.""",
+        withArguments: _withArgumentsConstructorWithWrongNameContext);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeConstructorWithWrongNameContext =
+    const Code<Message Function(String name)>("ConstructorWithWrongNameContext",
+        templateConstructorWithWrongNameContext,
+        severity: Severity.context);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsConstructorWithWrongNameContext(String name) {
+  return new Message(codeConstructorWithWrongNameContext,
+      message: """The name of the enclosing class is '$name'.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeContinueOutsideOfLoop = messageContinueOutsideOfLoop;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2607,29 +2639,6 @@
     message: r"""Illegal assignment to non-assignable expression.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name, String name2)>
-    templateIllegalMethodName =
-    const Template<Message Function(String name, String name2)>(
-        messageTemplate: r"""'#name' isn't a legal method name.""",
-        tipTemplate: r"""Did you mean '#name2'?""",
-        withArguments: _withArgumentsIllegalMethodName);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name, String name2)> codeIllegalMethodName =
-    const Code<Message Function(String name, String name2)>(
-  "IllegalMethodName",
-  templateIllegalMethodName,
-);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIllegalMethodName(String name, String name2) {
-  return new Message(codeIllegalMethodName,
-      message: """'$name' isn't a legal method name.""",
-      tip: """Did you mean '$name2'?""",
-      arguments: {'name': name, 'name2': name2});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateIllegalMixin =
     const Template<Message Function(String name)>(
         messageTemplate: r"""The type '#name' can't be mixed in.""",
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 0cfc1d8a..2a95602 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -89,7 +89,7 @@
       {Uri entryPoint, bool fullComponent: false}) async {
     ticker.reset();
     entryPoint ??= context.options.inputs.single;
-    return context.runInContext<Future<Component>>((CompilerContext c) async {
+    return context.runInContext<Component>((CompilerContext c) async {
       IncrementalCompilerData data = new IncrementalCompilerData();
 
       bool bypassCache = false;
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 0c388d7..c5612e8 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -3691,6 +3691,12 @@
   }
 
   @override
+  void beginTypeVariable(Token name) {
+    debugEvent("beginTypeVariable");
+    push(new Identifier(name));
+  }
+
+  @override
   void handleNoTypeVariables(Token token) {
     debugEvent("NoTypeVariables");
     enterFunctionTypeScope(null);
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
index c5291df..b2905ca 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
@@ -576,7 +576,7 @@
       String documentationComment,
       List<MetadataBuilder> metadata,
       int modifiers,
-      ConstructorReferenceBuilder constructorNameReference,
+      Object name,
       List<FormalParameterBuilder> formals,
       ConstructorReferenceBuilder redirectionTarget,
       int charOffset,
@@ -588,19 +588,17 @@
     // Nested declaration began in `OutlineBuilder.beginFactoryMethod`.
     DeclarationBuilder<KernelTypeBuilder> factoryDeclaration =
         endNestedDeclaration("#factory_method");
-    Object name = constructorNameReference.name;
 
     // Prepare the simple procedure name.
     String procedureName;
     String constructorName =
-        computeAndValidateConstructorName(name, charOffset);
+        computeAndValidateConstructorName(name, charOffset, isFactory: true);
     if (constructorName != null) {
       procedureName = constructorName;
     } else {
       procedureName = name;
     }
 
-    assert(constructorNameReference.suffix == null);
     KernelProcedureBuilder procedure;
     if (redirectionTarget != null) {
       procedure = new KernelRedirectingFactoryBuilder(
diff --git a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
index 65b8b20..9e8809f 100644
--- a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
@@ -392,8 +392,8 @@
   }
 
   @override
-  void beginTypeVariable(Token token) {
-    listener?.beginTypeVariable(token);
+  void beginTypeVariable(Token name) {
+    listener?.beginTypeVariable(name);
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/parser/listener.dart b/pkg/front_end/lib/src/fasta/parser/listener.dart
index e7bcb52..8e26b03 100644
--- a/pkg/front_end/lib/src/fasta/parser/listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/listener.dart
@@ -898,13 +898,16 @@
     logEvent("NoTypeArguments");
   }
 
-  void beginTypeVariable(Token token) {}
+  /// Handle the begin of a type formal parameter (e.g. "X extends Y").
+  /// Substructures:
+  /// - Metadata
+  void beginTypeVariable(Token name) {}
 
   /// Handle the end of a type formal parameter (e.g. "X extends Y").
   /// Substructures:
-  /// - Metadata
-  /// - Name (identifier)
   /// - Type bound
+  ///
+  /// See [beginTypeVariable] for additional substructures.
   void endTypeVariable(Token token, Token extendsOrSuper) {
     logEvent("TypeVariable");
   }
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index d1d73b2..e4e0063 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -1961,9 +1961,12 @@
   /// ;
   /// ```
   Token parseTypeVariable(Token token) {
-    listener.beginTypeVariable(token.next);
     token = parseMetadataStar(token);
-    token = ensureIdentifier(token, IdentifierContext.typeVariableDeclaration);
+    token = token.next.kind == IDENTIFIER_TOKEN
+        ? token.next
+        : IdentifierContext.typeVariableDeclaration
+            .ensureIdentifier(token, this);
+    listener.beginTypeVariable(token);
     Token extendsOrSuper = null;
     Token next = token.next;
     if (optional('extends', next) || optional('super', next)) {
@@ -3232,7 +3235,10 @@
     }
 
     listener.beginFactoryMethod(beforeStart, externalToken, varFinalOrConst);
-    token = parseConstructorReference(token);
+    token = ensureIdentifier(token, IdentifierContext.methodDeclaration);
+    token = parseQualifiedRestOpt(
+        token, IdentifierContext.methodDeclarationContinuation);
+    token = parseMethodTypeVar(token);
     token = parseFormalParametersRequiredOpt(token, MemberKind.Factory);
     Token asyncToken = token.next;
     token = parseAsyncModifierOpt(token);
@@ -4276,25 +4282,55 @@
     Token beginToken = token = token.next;
     assert(optional('[', token) || optional('[]', token));
     int count = 0;
-    if (optional('[', token)) {
-      bool old = mayParseFunctionExpressions;
-      mayParseFunctionExpressions = true;
-      do {
-        if (optional(']', token.next)) {
-          token = token.next;
+    if (optional('[]', token)) {
+      token = rewriteSquareBrackets(beforeToken).next;
+      listener.handleLiteralList(0, token, constKeyword, token.next);
+      return token.next;
+    }
+    bool old = mayParseFunctionExpressions;
+    mayParseFunctionExpressions = true;
+    while (true) {
+      Token next = token.next;
+      if (optional(']', next)) {
+        token = next;
+        break;
+      }
+      token = parseExpression(token);
+      next = token.next;
+      ++count;
+      if (!optional(',', next)) {
+        if (optional(']', next)) {
+          token = next;
           break;
         }
-        token = parseExpression(token).next;
-        ++count;
-      } while (optional(',', token));
-      mayParseFunctionExpressions = old;
-      listener.handleLiteralList(count, beginToken, constKeyword, token);
-      expect(']', token);
-      return token;
+
+        // Recovery
+        if (!isExpressionStartForRecovery(next)) {
+          if (beginToken.endGroup.isSynthetic) {
+            // The scanner has already reported an error,
+            // but inserted `]` in the wrong place.
+            token = rewriter.moveSynthetic(token, beginToken.endGroup);
+          } else {
+            // Report an error and jump to the end of the list.
+            reportRecoverableError(
+                next, fasta.templateExpectedButGot.withArguments(']'));
+            token = beginToken.endGroup;
+          }
+          break;
+        }
+        // This looks like the start of an expression.
+        // Report an error, insert the comma, and continue parsing.
+        next = rewriteAndRecover(
+                token,
+                fasta.templateExpectedButGot.withArguments(','),
+                new SyntheticToken(TokenType.COMMA, next.offset))
+            .next;
+      }
+      token = next;
     }
-    token = rewriteSquareBrackets(beforeToken).next;
-    listener.handleLiteralList(0, token, constKeyword, token.next);
-    return token.next;
+    mayParseFunctionExpressions = old;
+    listener.handleLiteralList(count, beginToken, constKeyword, token);
+    return token;
   }
 
   /// This method parses the portion of a map literal that starts with the left
diff --git a/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart b/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
index 771ed1c..2b8f311 100644
--- a/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
+++ b/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
@@ -138,10 +138,9 @@
 
   @override
   Token skipType(Token token) {
-    token = token.next.next;
-    assert(optional('<', token));
-    assert(token.endGroup != null || optional('>>', token.next.next));
-    return token.endGroup ?? token.next;
+    token = token.next;
+    assert(token.isKeywordOrIdentifier);
+    return simpleTypeArgument1.skip(token);
   }
 }
 
@@ -510,10 +509,9 @@
     Listener listener = parser.listener;
     listener.beginTypeVariables(token);
     token = token.next;
-    listener.beginTypeVariable(token);
     listener.beginMetadataStar(token);
     listener.endMetadataStar(0);
-    listener.handleIdentifier(token, IdentifierContext.typeVariableDeclaration);
+    listener.beginTypeVariable(token);
     listener.handleNoType(token);
     token = processEndGroup(token, start, parser);
     listener.endTypeVariable(token, null);
@@ -527,9 +525,9 @@
     assert(optional('<', token));
     assert(token.endGroup != null ||
         (optional('>', token.next.next) || optional('>>', token.next.next)));
-    return (optional('>>', token.endGroup ?? token.next.next)
-        ? token.next
-        : token.next.next);
+    return (optional('>', token.endGroup ?? token.next.next)
+        ? token.next.next
+        : token.next);
   }
 }
 
@@ -659,10 +657,12 @@
     parser.listener.beginTypeVariables(start);
     int count = 0;
     while (true) {
-      parser.listener.beginTypeVariable(next.next);
       token = parser.parseMetadataStar(next);
-      token = parser.ensureIdentifier(
-          token, IdentifierContext.typeVariableDeclaration);
+      token = token.next.kind == IDENTIFIER_TOKEN
+          ? token.next
+          : IdentifierContext.typeVariableDeclaration
+              .ensureIdentifier(token, parser);
+      parser.listener.beginTypeVariable(token);
       Token extendsOrSuper = null;
       next = token.next;
       if (optional('extends', next) || optional('super', next)) {
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 a00fc34..eeef8b1 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -444,7 +444,7 @@
   @override
   void endTypeVariable(Token token, Token extendsOrSuper) {
     debugEvent("TypeVariable");
-    discard(2); // Name and metadata.
+    discard(1); // Metadata.
   }
 
   @override
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 5086d9e..e65dcf6 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -397,6 +397,7 @@
     push(typeVariables ?? NullValue.TypeVariables);
     library.currentDeclaration
       ..name = name.lexeme
+      ..charOffset = name.charOffset
       ..typeVariables = typeVariables;
     push(abstractToken != null ? abstractMask : 0);
   }
@@ -409,6 +410,7 @@
     push(typeVariables ?? NullValue.TypeVariables);
     library.currentDeclaration
       ..name = name.lexeme
+      ..charOffset = name.charOffset
       ..typeVariables = typeVariables;
     push(abstractToken != null ? abstractMask : 0);
   }
@@ -1095,6 +1097,13 @@
   }
 
   @override
+  void beginTypeVariable(Token token) {
+    debugEvent("beginTypeVariable");
+    push(token.lexeme);
+    push(token.charOffset);
+  }
+
+  @override
   void endTypeVariable(Token token, Token extendsOrSuper) {
     debugEvent("endTypeVariable");
     TypeBuilder bound = pop();
@@ -1136,6 +1145,7 @@
   @override
   void beginFactoryMethod(
       Token lastConsumed, Token externalToken, Token constToken) {
+    inConstructor = true;
     library.beginNestedDeclaration("#factory_method", hasMembers: false);
     push((externalToken != null ? externalMask : 0) |
         (constToken != null ? constMask : 0));
@@ -1152,7 +1162,9 @@
     }
     List<FormalParameterBuilder> formals = pop();
     int formalsOffset = pop();
-    var name = pop();
+    pop(); // type variables
+    int charOffset = pop();
+    Object name = pop();
     int modifiers = pop();
     List<MetadataBuilder> metadata = pop();
     String documentationComment = getDocumentationComment(beginToken);
@@ -1163,11 +1175,12 @@
         name,
         formals,
         redirectionTarget,
-        factoryKeyword.next.charOffset,
+        charOffset,
         formalsOffset,
         endToken.charOffset,
         nativeMethodName);
     nativeMethodName = null;
+    inConstructor = false;
   }
 
   @override
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 8e28bcc..93390f9 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
@@ -39,6 +39,7 @@
 
 import '../fasta_codes.dart'
     show
+        messageConstructorWithWrongName,
         messageExpectedUri,
         messageMemberWithSameNameAsClass,
         messagePartOfSelf,
@@ -49,7 +50,7 @@
         templateDeferredPrefixDuplicated,
         templateDeferredPrefixDuplicatedCause,
         templateDuplicatedDefinition,
-        templateIllegalMethodName,
+        templateConstructorWithWrongNameContext,
         templateMissingPartOf,
         templatePartOfLibraryNameMismatch,
         templatePartOfUriMismatch,
@@ -193,7 +194,8 @@
     }
   }
 
-  String computeAndValidateConstructorName(Object name, int charOffset) {
+  String computeAndValidateConstructorName(Object name, int charOffset,
+      {isFactory: false}) {
     String className = currentDeclaration.name;
     String prefix;
     String suffix;
@@ -207,15 +209,20 @@
     if (prefix == className) {
       return suffix ?? "";
     }
-    if (suffix == null) {
+    if (suffix == null && !isFactory) {
       // A legal name for a regular method, but not for a constructor.
       return null;
     }
-    addCompileTimeError(
-        templateIllegalMethodName.withArguments("$name", "$className.$suffix"),
-        charOffset,
-        noLength,
-        fileUri);
+
+    addProblem(
+        messageConstructorWithWrongName, charOffset, prefix.length, fileUri,
+        context: [
+          templateConstructorWithWrongNameContext
+              .withArguments(currentDeclaration.name)
+              .withLocation(uri, currentDeclaration.charOffset,
+                  currentDeclaration.name.length)
+        ]);
+
     return suffix;
   }
 
@@ -424,7 +431,7 @@
       String documentationComment,
       List<MetadataBuilder> metadata,
       int modifiers,
-      ConstructorReferenceBuilder name,
+      Object name,
       List<FormalParameterBuilder> formals,
       ConstructorReferenceBuilder redirectionTarget,
       int charOffset,
@@ -747,16 +754,20 @@
 
   String name;
 
+  // Offset of name token, updated by the outline builder along
+  // with the name as the current declaration changes.
+  int charOffset;
+
   List<TypeVariableBuilder> typeVariables;
 
-  DeclarationBuilder(
-      this.members, this.setters, this.constructors, this.name, this.parent) {
+  DeclarationBuilder(this.members, this.setters, this.constructors, this.name,
+      this.charOffset, this.parent) {
     assert(name != null);
   }
 
   DeclarationBuilder.library()
       : this(<String, Declaration>{}, <String, Declaration>{}, null, "library",
-            null);
+            -1, null);
 
   DeclarationBuilder createNested(String name, bool hasMembers) {
     return new DeclarationBuilder<T>(
@@ -764,6 +775,7 @@
         hasMembers ? <String, MemberBuilder>{} : null,
         hasMembers ? <String, MemberBuilder>{} : null,
         name,
+        -1,
         this);
   }
 
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index c836042..47d7166 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -201,8 +201,6 @@
 GetterNotFound/example: Fail
 GetterWithFormals/example: Fail
 IllegalAssignmentToNonAssignable/script1: Fail
-IllegalMethodName/analyzerCode: Fail
-IllegalMethodName/example: Fail
 IllegalMixin/analyzerCode: Fail
 IllegalMixin/example: Fail
 IllegalMixinDueToConstructors/analyzerCode: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index e37ae4a..4eb8ac6 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -1028,6 +1028,22 @@
   script:
     - "class C { C<T>() {} }"
     - "class C { C.foo<T>() {} }"
+    - "class C { factory C<T>() => null; }"
+    - "class C { factory C.foo<T>() => null; }"
+
+ConstructorWithWrongName:
+  template: "The name of a constructor must match the name of the enclosing class."
+  severity: ERROR
+  analyzerCode: INVALID_CONSTRUCTOR_NAME
+  dart2jsCode: "*fatal*"
+  script:
+    - "class A { B.foo() {} }"
+    - "class A { factory B() => null; }"
+    - "class A { factory B.foo() => null; }"
+
+ConstructorWithWrongNameContext:
+  template: "The name of the enclosing class is '#name'."
+  severity: CONTEXT
 
 FieldInitializerOutsideConstructor:
   template: "Field formal parameters can only be used in a constructor."
@@ -1557,10 +1573,6 @@
   analyzerCode: INVALID_METHOD_OVERRIDE
   dart2jsCode: "*ignored*"
 
-IllegalMethodName:
-  template: "'#name' isn't a legal method name."
-  tip: "Did you mean '#name2'?"
-
 PartOfSelf:
   template: "A file can't be a part of itself."
 
diff --git a/pkg/front_end/test/fasta/expression_test.dart b/pkg/front_end/test/fasta/expression_test.dart
index ee56f71..91f716e 100644
--- a/pkg/front_end/test/fasta/expression_test.dart
+++ b/pkg/front_end/test/fasta/expression_test.dart
@@ -66,7 +66,7 @@
 
   MemoryFileSystem get fileSystem => options.fileSystem;
 
-  T runInContext<T>(T action(CompilerContext c)) {
+  Future<T> runInContext<T>(Future<T> action(CompilerContext c)) {
     return compilerContext.runInContext<T>(action);
   }
 
diff --git a/pkg/front_end/test/fasta/incremental_test.dart b/pkg/front_end/test/fasta/incremental_test.dart
index 401d89b..d6e5f8d 100644
--- a/pkg/front_end/test/fasta/incremental_test.dart
+++ b/pkg/front_end/test/fasta/incremental_test.dart
@@ -70,7 +70,7 @@
 
   MemoryFileSystem get fileSystem => options.fileSystem;
 
-  T runInContext<T>(T action(CompilerContext c)) {
+  Future<T> runInContext<T>(Future<T> action(CompilerContext c)) {
     return compilerContext.runInContext<T>(action);
   }
 
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 f208149..1299b8d 100644
--- a/pkg/front_end/test/fasta/parser/type_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/type_info_test.dart
@@ -282,10 +282,9 @@
     ]);
     expectComplexInfo('Function<T>() m', expectedAfter: 'm', expectedCalls: [
       'beginTypeVariables <',
-      'beginTypeVariable T',
       'beginMetadataStar T',
       'endMetadataStar 0',
-      'handleIdentifier T typeVariableDeclaration',
+      'beginTypeVariable T',
       'handleNoType T',
       'endTypeVariable > null',
       'endTypeVariables 1 < >',
@@ -315,10 +314,9 @@
     ]);
     expectComplexInfo('Function<T>(int) m', expectedAfter: 'm', expectedCalls: [
       'beginTypeVariables <',
-      'beginTypeVariable T',
       'beginMetadataStar T',
       'endMetadataStar 0',
-      'handleIdentifier T typeVariableDeclaration',
+      'beginTypeVariable T',
       'handleNoType T',
       'endTypeVariable > null',
       'endTypeVariables 1 < >',
@@ -684,19 +682,17 @@
         required: true,
         expectedCalls: [
           'beginTypeVariables <',
-          'beginTypeVariable T',
           'beginMetadataStar T',
           'endMetadataStar 0',
-          'handleIdentifier T typeVariableDeclaration',
+          'beginTypeVariable T',
           'handleNoType T',
           'endTypeVariable > null',
           'endTypeVariables 1 < >',
           'beginFunctionType C',
           'beginTypeVariables <',
-          'beginTypeVariable T',
           'beginMetadataStar T',
           'endMetadataStar 0',
-          'handleIdentifier T typeVariableDeclaration',
+          'beginTypeVariable T',
           'handleNoType T',
           'endTypeVariable > null',
           'endTypeVariables 1 < >',
@@ -863,10 +859,9 @@
     expect(simpleTypeArgument1.parseVariables(start, new Parser(listener)), gt);
     expect(listener.calls, [
       'beginTypeVariables <',
-      'beginTypeVariable T',
       'beginMetadataStar T',
       'endMetadataStar 0',
-      'handleIdentifier T typeVariableDeclaration',
+      'beginTypeVariable T',
       'handleNoType T',
       'endTypeVariable > null',
       'endTypeVariables 1 < >',
@@ -1041,26 +1036,23 @@
   void test_computeTypeParam_complex() {
     expectComplexTypeParam('<S,T>', expectedCalls: [
       'beginTypeVariables <',
-      'beginTypeVariable S',
       'beginMetadataStar S',
       'endMetadataStar 0',
-      'handleIdentifier S typeVariableDeclaration',
+      'beginTypeVariable S',
       'handleNoType S',
       'endTypeVariable , null',
-      'beginTypeVariable T',
       'beginMetadataStar T',
       'endMetadataStar 0',
-      'handleIdentifier T typeVariableDeclaration',
+      'beginTypeVariable T',
       'handleNoType T',
       'endTypeVariable > null',
       'endTypeVariables 2 < >',
     ]);
     expectComplexTypeParam('<S extends T>', expectedCalls: [
       'beginTypeVariables <',
-      'beginTypeVariable S',
       'beginMetadataStar S',
       'endMetadataStar 0',
-      'handleIdentifier S typeVariableDeclaration',
+      'beginTypeVariable S',
       'handleIdentifier T typeReference',
       'handleNoTypeArguments >',
       'handleType T >',
@@ -1069,10 +1061,9 @@
     ]);
     expectComplexTypeParam('<S super T>', expectedCalls: [
       'beginTypeVariables <',
-      'beginTypeVariable S',
       'beginMetadataStar S',
       'endMetadataStar 0',
-      'handleIdentifier S typeVariableDeclaration',
+      'beginTypeVariable S',
       'handleIdentifier T typeReference',
       'handleNoTypeArguments >',
       'handleType T >',
@@ -1081,10 +1072,9 @@
     ]);
     expectComplexTypeParam('<S extends List<T>>', expectedCalls: [
       'beginTypeVariables <',
-      'beginTypeVariable S',
       'beginMetadataStar S',
       'endMetadataStar 0',
-      'handleIdentifier S typeVariableDeclaration',
+      'beginTypeVariable S',
       'handleIdentifier List typeReference',
       'beginTypeArguments <',
       'handleIdentifier T typeReference',
@@ -1097,16 +1087,14 @@
     ]);
     expectComplexTypeParam('<R, S extends void Function()>', expectedCalls: [
       'beginTypeVariables <',
-      'beginTypeVariable R',
       'beginMetadataStar R',
       'endMetadataStar 0',
-      'handleIdentifier R typeVariableDeclaration',
+      'beginTypeVariable R',
       'handleNoType R',
       'endTypeVariable , null',
-      'beginTypeVariable S',
       'beginMetadataStar S',
       'endMetadataStar 0',
-      'handleIdentifier S typeVariableDeclaration',
+      'beginTypeVariable S',
       'handleNoTypeVariables (',
       'beginFunctionType void',
       'handleVoidKeyword void',
@@ -1118,7 +1106,6 @@
     ]);
     expectComplexTypeParam('<@A S,T>', expectedCalls: [
       'beginTypeVariables <',
-      'beginTypeVariable @',
       'beginMetadataStar @',
       'beginMetadata @',
       'handleIdentifier A metadataReference',
@@ -1126,20 +1113,18 @@
       'handleNoArguments S',
       'endMetadata @ null S',
       'endMetadataStar 1',
-      'handleIdentifier S typeVariableDeclaration',
+      'beginTypeVariable S',
       'handleNoType S',
       'endTypeVariable , null',
-      'beginTypeVariable T',
       'beginMetadataStar T',
       'endMetadataStar 0',
-      'handleIdentifier T typeVariableDeclaration',
+      'beginTypeVariable T',
       'handleNoType T',
       'endTypeVariable > null',
       'endTypeVariables 2 < >',
     ]);
     expectComplexTypeParam('<@A() S,T>', expectedCalls: [
       'beginTypeVariables <',
-      'beginTypeVariable @',
       'beginMetadataStar @',
       'beginMetadata @',
       'handleIdentifier A metadataReference',
@@ -1148,20 +1133,18 @@
       'endArguments 0 ( )',
       'endMetadata @ null S',
       'endMetadataStar 1',
-      'handleIdentifier S typeVariableDeclaration',
+      'beginTypeVariable S',
       'handleNoType S',
       'endTypeVariable , null',
-      'beginTypeVariable T',
       'beginMetadataStar T',
       'endMetadataStar 0',
-      'handleIdentifier T typeVariableDeclaration',
+      'beginTypeVariable T',
       'handleNoType T',
       'endTypeVariable > null',
       'endTypeVariables 2 < >',
     ]);
     expectComplexTypeParam('<@A() @B S,T>', expectedCalls: [
       'beginTypeVariables <',
-      'beginTypeVariable @',
       'beginMetadataStar @',
       'beginMetadata @',
       'handleIdentifier A metadataReference',
@@ -1175,13 +1158,12 @@
       'handleNoArguments S',
       'endMetadata @ null S',
       'endMetadataStar 2',
-      'handleIdentifier S typeVariableDeclaration',
+      'beginTypeVariable S',
       'handleNoType S',
       'endTypeVariable , null',
-      'beginTypeVariable T',
       'beginMetadataStar T',
       'endMetadataStar 0',
-      'handleIdentifier T typeVariableDeclaration',
+      'beginTypeVariable T',
       'handleNoType T',
       'endTypeVariable > null',
       'endTypeVariables 2 < >',
@@ -1193,10 +1175,9 @@
       error(codeUnexpectedToken, 3, 8),
     ], expectedCalls: [
       'beginTypeVariables <',
-      'beginTypeVariable S',
       'beginMetadataStar S',
       'endMetadataStar 0',
-      'handleIdentifier S typeVariableDeclaration',
+      'beginTypeVariable S',
       'handleNoType S',
       'endTypeVariable Function null',
       'endTypeVariables 1 < >',
@@ -1206,10 +1187,9 @@
       error(codeUnexpectedToken, 1, 4),
     ], expectedCalls: [
       'beginTypeVariables <',
-      'beginTypeVariable void',
       'beginMetadataStar void',
       'endMetadataStar 0',
-      'handleIdentifier  typeVariableDeclaration',
+      'beginTypeVariable ',
       'handleNoType ',
       'endTypeVariable void null',
       'endTypeVariables 1 < >',
@@ -1218,10 +1198,9 @@
       error(codeUnexpectedToken, 2, 1),
     ], expectedCalls: [
       'beginTypeVariables <',
-      'beginTypeVariable S',
       'beginMetadataStar S',
       'endMetadataStar 0',
-      'handleIdentifier S typeVariableDeclaration',
+      'beginTypeVariable S',
       'handleNoType S',
       'endTypeVariable < null',
       'endTypeVariables 1 < >',
@@ -1513,8 +1492,8 @@
   }
 
   @override
-  void beginTypeVariable(Token token) {
-    calls.add('beginTypeVariable $token');
+  void beginTypeVariable(Token name) {
+    calls.add('beginTypeVariable $name');
   }
 
   @override
diff --git a/pkg/front_end/test/scanner_test.dart b/pkg/front_end/test/scanner_test.dart
index d03ee59..3878155 100644
--- a/pkg/front_end/test/scanner_test.dart
+++ b/pkg/front_end/test/scanner_test.dart
@@ -1279,7 +1279,7 @@
       new StringToken(TokenType.STRING, "", 3),
       new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 3),
     ];
-    var expectedErrors = [];
+    var expectedErrors = <TestError>[];
     if (usingFasta) {
       // Fasta scanner inserts a synthetic identifier
       expectedTokens.addAll([
@@ -1305,7 +1305,7 @@
       new StringToken(TokenType.STRING, "'", 0),
       new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1),
     ];
-    var expectedErrors = [];
+    var expectedErrors = <TestError>[];
     if (usingFasta) {
       expectedTokens.addAll([
         new SyntheticStringToken(TokenType.IDENTIFIER, "", 2),
diff --git a/pkg/front_end/testcases/inference/bug33324.dart b/pkg/front_end/testcases/inference/bug33324.dart
new file mode 100644
index 0000000..cdce5f17
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug33324.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that the greatest closure uses 'dynamic' and not Object as
+// the top type.
+
+int foo() {
+  Function f = (x) => x;
+  var l = ["bar"].map(f).toList();
+  l.add(42);
+  return l.first.length;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/inference/bug33324.dart.direct.expect b/pkg/front_end/testcases/inference/bug33324.dart.direct.expect
new file mode 100644
index 0000000..2e1ecb9
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug33324.dart.direct.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method foo() → core::int {
+  core::Function f = (dynamic x) → dynamic => x;
+  dynamic l = <dynamic>["bar"].map(f).toList();
+  l.add(42);
+  return l.first.length;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug33324.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/bug33324.dart.direct.transformed.expect
new file mode 100644
index 0000000..2e1ecb9
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug33324.dart.direct.transformed.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method foo() → core::int {
+  core::Function f = (dynamic x) → dynamic => x;
+  dynamic l = <dynamic>["bar"].map(f).toList();
+  l.add(42);
+  return l.first.length;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug33324.dart.outline.expect b/pkg/front_end/testcases/inference/bug33324.dart.outline.expect
new file mode 100644
index 0000000..06c9cfc
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug33324.dart.outline.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method foo() → core::int
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/bug33324.dart.strong.expect b/pkg/front_end/testcases/inference/bug33324.dart.strong.expect
new file mode 100644
index 0000000..f88135b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug33324.dart.strong.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method foo() → core::int {
+  core::Function f = (dynamic x) → dynamic => x;
+  core::List<dynamic> l = <core::String>["bar"].{core::Iterable::map}<dynamic>(f as{TypeError} (core::String) → dynamic).{core::Iterable::toList}();
+  l.{core::List::add}(42);
+  return l.{core::Iterable::first}.length as{TypeError} core::int;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug33324.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/bug33324.dart.strong.transformed.expect
new file mode 100644
index 0000000..f88135b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug33324.dart.strong.transformed.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method foo() → core::int {
+  core::Function f = (dynamic x) → dynamic => x;
+  core::List<dynamic> l = <core::String>["bar"].{core::Iterable::map}<dynamic>(f as{TypeError} (core::String) → dynamic).{core::Iterable::toList}();
+  l.{core::List::add}(42);
+  return l.{core::Iterable::first}.length as{TypeError} core::int;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect
index e3ccda9..e9adaf2 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect
@@ -10,6 +10,6 @@
     return (self::C::T y) → core::Null {};
 }
 static method test(self::C<core::String> c) → void {
-  (core::int) → (core::String) → void tearoff = c.{self::C::f} as{TypeError} <U extends core::Object>(U) → (core::String) → void<core::int>;
+  (core::int) → (core::String) → void tearoff = c.{self::C::f} as{TypeError} <U extends core::Object = dynamic>(U) → (core::String) → void<core::int>;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect
index e3ccda9..e9adaf2 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect
@@ -10,6 +10,6 @@
     return (self::C::T y) → core::Null {};
 }
 static method test(self::C<core::String> c) → void {
-  (core::int) → (core::String) → void tearoff = c.{self::C::f} as{TypeError} <U extends core::Object>(U) → (core::String) → void<core::int>;
+  (core::int) → (core::String) → void tearoff = c.{self::C::f} as{TypeError} <U extends core::Object = dynamic>(U) → (core::String) → void<core::int>;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/qualified.dart.direct.expect b/pkg/front_end/testcases/qualified.dart.direct.expect
index 545aedf..9d40d19 100644
--- a/pkg/front_end/testcases/qualified.dart.direct.expect
+++ b/pkg/front_end/testcases/qualified.dart.direct.expect
@@ -25,7 +25,9 @@
   static factory b<T extends core::Object = dynamic>() → self::C<self::C::b::T>
     let dynamic #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
+  factory WrongName() {}
+          ^^^^^^^^^", "pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
 class Bad extends lib.Missing {
                   ^"]/* from null */;
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/qualified.dart.direct.transformed.expect b/pkg/front_end/testcases/qualified.dart.direct.transformed.expect
index de3c17e..34fd3f9 100644
--- a/pkg/front_end/testcases/qualified.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/qualified.dart.direct.transformed.expect
@@ -31,7 +31,9 @@
   static factory b<T extends core::Object = dynamic>() → self::C<self::C::b::T>
     let dynamic #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
+  factory WrongName() {}
+          ^^^^^^^^^", "pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
 class Bad extends lib.Missing {
                   ^"]/* from null */;
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/qualified.dart.strong.expect b/pkg/front_end/testcases/qualified.dart.strong.expect
index 9dceec4..1b186df 100644
--- a/pkg/front_end/testcases/qualified.dart.strong.expect
+++ b/pkg/front_end/testcases/qualified.dart.strong.expect
@@ -25,13 +25,13 @@
   static factory b<T extends core::Object = dynamic>() → self::C<self::C::b::T>
     let dynamic #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart:12:3: Error: Type 'lib.Missing' not found.
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
+  factory WrongName() {}
+          ^^^^^^^^^", "pkg/front_end/testcases/qualified.dart:12:3: Error: Type 'lib.Missing' not found.
   lib.Missing method() {}
   ^", "pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
 class Bad extends lib.Missing {
-                  ^", "pkg/front_end/testcases/qualified.dart:13:11: Error: Couldn't find constructor 'WrongName'.
-  factory WrongName() {}
-          ^"]/* from null */;
+                  ^"]/* from null */;
 static method main() → dynamic {
   new self::C::•<core::String>();
   new self::C::a<core::String>();
diff --git a/pkg/front_end/testcases/qualified.dart.strong.transformed.expect b/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
index 2c96429..b00d2b5 100644
--- a/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
@@ -31,13 +31,13 @@
   static factory b<T extends core::Object = dynamic>() → self::C<self::C::b::T>
     let <T extends core::Object = dynamic>() → lib::C<lib::C::b::T> #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart:12:3: Error: Type 'lib.Missing' not found.
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
+  factory WrongName() {}
+          ^^^^^^^^^", "pkg/front_end/testcases/qualified.dart:12:3: Error: Type 'lib.Missing' not found.
   lib.Missing method() {}
   ^", "pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
 class Bad extends lib.Missing {
-                  ^", "pkg/front_end/testcases/qualified.dart:13:11: Error: Couldn't find constructor 'WrongName'.
-  factory WrongName() {}
-          ^"]/* from null */;
+                  ^"]/* from null */;
 static method main() → dynamic {
   new self::C::•<core::String>();
   new self::C::a<core::String>();
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.direct.expect b/pkg/front_end/testcases/regress/issue_30838.dart.direct.expect
index 9e4af92..9efb697 100644
--- a/pkg/front_end/testcases/regress/issue_30838.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.direct.expect
@@ -4,7 +4,7 @@
 
 typedef Foo<S extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → S;
 class A extends core::Object {
-  field <T extends core::Object>(T) → core::int f = null;
+  field <T extends core::Object = dynamic>(T) → core::int f = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -14,7 +14,7 @@
 }
 static method foo<T extends core::Object = dynamic>(self::foo::T x) → core::int
   return 3;
-static method bar() → <T extends core::Object>(T) → core::int
+static method bar() → <T extends core::Object = dynamic>(T) → core::int
   return self::foo;
 static method test1() → void {
   self::bar().call<core::String>("hello");
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_30838.dart.direct.transformed.expect
index 9e4af92..9efb697 100644
--- a/pkg/front_end/testcases/regress/issue_30838.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef Foo<S extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → S;
 class A extends core::Object {
-  field <T extends core::Object>(T) → core::int f = null;
+  field <T extends core::Object = dynamic>(T) → core::int f = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -14,7 +14,7 @@
 }
 static method foo<T extends core::Object = dynamic>(self::foo::T x) → core::int
   return 3;
-static method bar() → <T extends core::Object>(T) → core::int
+static method bar() → <T extends core::Object = dynamic>(T) → core::int
   return self::foo;
 static method test1() → void {
   self::bar().call<core::String>("hello");
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.outline.expect b/pkg/front_end/testcases/regress/issue_30838.dart.outline.expect
index 55709ba..10ab505 100644
--- a/pkg/front_end/testcases/regress/issue_30838.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.outline.expect
@@ -4,7 +4,7 @@
 
 typedef Foo<S extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → S;
 class A extends core::Object {
-  field <T extends core::Object>(T) → core::int f;
+  field <T extends core::Object = dynamic>(T) → core::int f;
   synthetic constructor •() → void
     ;
   method test() → void
@@ -12,7 +12,7 @@
 }
 static method foo<T extends core::Object = dynamic>(self::foo::T x) → core::int
   ;
-static method bar() → <T extends core::Object>(T) → core::int
+static method bar() → <T extends core::Object = dynamic>(T) → core::int
   ;
 static method test1() → void
   ;
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.strong.expect b/pkg/front_end/testcases/regress/issue_30838.dart.strong.expect
index f08b8e7..7526f86 100644
--- a/pkg/front_end/testcases/regress/issue_30838.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.strong.expect
@@ -4,7 +4,7 @@
 
 typedef Foo<S extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → S;
 class A extends core::Object {
-  field <T extends core::Object>(T) → core::int f = null;
+  field <T extends core::Object = dynamic>(T) → core::int f = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -14,7 +14,7 @@
 }
 static method foo<T extends core::Object = dynamic>(self::foo::T x) → core::int
   return 3;
-static method bar() → <T extends core::Object>(T) → core::int
+static method bar() → <T extends core::Object = dynamic>(T) → core::int
   return self::foo;
 static method test1() → void {
   self::bar().call<core::String>("hello");
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_30838.dart.strong.transformed.expect
index f08b8e7..7526f86 100644
--- a/pkg/front_end/testcases/regress/issue_30838.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef Foo<S extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → S;
 class A extends core::Object {
-  field <T extends core::Object>(T) → core::int f = null;
+  field <T extends core::Object = dynamic>(T) → core::int f = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
@@ -14,7 +14,7 @@
 }
 static method foo<T extends core::Object = dynamic>(self::foo::T x) → core::int
   return 3;
-static method bar() → <T extends core::Object>(T) → core::int
+static method bar() → <T extends core::Object = dynamic>(T) → core::int
   return self::foo;
 static method test1() → void {
   self::bar().call<core::String>("hello");
diff --git a/pkg/front_end/testcases/regress/issue_31213.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31213.dart.direct.expect
index a54adf0..da2a301 100644
--- a/pkg/front_end/testcases/regress/issue_31213.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31213.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 typedef C<A extends core::Object = dynamic, K extends core::Object = dynamic> = <B extends core::Object = dynamic>(A, K, B) → core::int;
-typedef D<K extends core::Object = dynamic> = <A extends core::Object = dynamic>(core::int) → <B extends core::Object>(A, K, B) → core::int;
+typedef D<K extends core::Object = dynamic> = <A extends core::Object = dynamic>(core::int) → <B extends core::Object = dynamic>(A, K, B) → core::int;
 static method producer<K extends core::Object = dynamic>() → dynamic {
   return <A extends core::Object = dynamic>(core::int v1) → dynamic {
     return <B extends core::Object = dynamic>(A v2, self::producer::K v3, B v4) → dynamic => 0;
   };
 }
 static method main() → dynamic {
-  assert(self::producer<core::String>() is <A extends core::Object>(core::int) → <B extends core::Object>(A, core::String, B) → core::int);
+  assert(self::producer<core::String>() is <A extends core::Object = dynamic>(core::int) → <B extends core::Object = dynamic>(A, core::String, B) → core::int);
 }
diff --git a/pkg/front_end/testcases/regress/issue_31213.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31213.dart.direct.transformed.expect
index a54adf0..da2a301 100644
--- a/pkg/front_end/testcases/regress/issue_31213.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31213.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 typedef C<A extends core::Object = dynamic, K extends core::Object = dynamic> = <B extends core::Object = dynamic>(A, K, B) → core::int;
-typedef D<K extends core::Object = dynamic> = <A extends core::Object = dynamic>(core::int) → <B extends core::Object>(A, K, B) → core::int;
+typedef D<K extends core::Object = dynamic> = <A extends core::Object = dynamic>(core::int) → <B extends core::Object = dynamic>(A, K, B) → core::int;
 static method producer<K extends core::Object = dynamic>() → dynamic {
   return <A extends core::Object = dynamic>(core::int v1) → dynamic {
     return <B extends core::Object = dynamic>(A v2, self::producer::K v3, B v4) → dynamic => 0;
   };
 }
 static method main() → dynamic {
-  assert(self::producer<core::String>() is <A extends core::Object>(core::int) → <B extends core::Object>(A, core::String, B) → core::int);
+  assert(self::producer<core::String>() is <A extends core::Object = dynamic>(core::int) → <B extends core::Object = dynamic>(A, core::String, B) → core::int);
 }
diff --git a/pkg/front_end/testcases/regress/issue_31213.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31213.dart.outline.expect
index 2626a19..a1d78e7 100644
--- a/pkg/front_end/testcases/regress/issue_31213.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31213.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 typedef C<A extends core::Object = dynamic, K extends core::Object = dynamic> = <B extends core::Object = dynamic>(A, K, B) → core::int;
-typedef D<K extends core::Object = dynamic> = <A extends core::Object = dynamic>(core::int) → <B extends core::Object>(A, K, B) → core::int;
+typedef D<K extends core::Object = dynamic> = <A extends core::Object = dynamic>(core::int) → <B extends core::Object = dynamic>(A, K, B) → core::int;
 static method producer<K extends core::Object = dynamic>() → dynamic
   ;
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_31213.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31213.dart.strong.expect
index 730da9b..2bb9fe5 100644
--- a/pkg/front_end/testcases/regress/issue_31213.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31213.dart.strong.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 typedef C<A extends core::Object = dynamic, K extends core::Object = dynamic> = <B extends core::Object = dynamic>(A, K, B) → core::int;
-typedef D<K extends core::Object = dynamic> = <A extends core::Object = dynamic>(core::int) → <B extends core::Object>(A, K, B) → core::int;
+typedef D<K extends core::Object = dynamic> = <A extends core::Object = dynamic>(core::int) → <B extends core::Object = dynamic>(A, K, B) → core::int;
 static method producer<K extends core::Object = dynamic>() → dynamic {
   return <A extends core::Object = dynamic>(core::int v1) → <B extends core::Object = dynamic>(A, self::producer::K, B) → core::int {
     return <B extends core::Object = dynamic>(A v2, self::producer::K v3, B v4) → core::int => 0;
   };
 }
 static method main() → dynamic {
-  assert(self::producer<core::String>() is <A extends core::Object>(core::int) → <B extends core::Object>(A, core::String, B) → core::int);
+  assert(self::producer<core::String>() is <A extends core::Object = dynamic>(core::int) → <B extends core::Object = dynamic>(A, core::String, B) → core::int);
 }
diff --git a/pkg/front_end/testcases/regress/issue_31213.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31213.dart.strong.transformed.expect
index 730da9b..2bb9fe5 100644
--- a/pkg/front_end/testcases/regress/issue_31213.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31213.dart.strong.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 typedef C<A extends core::Object = dynamic, K extends core::Object = dynamic> = <B extends core::Object = dynamic>(A, K, B) → core::int;
-typedef D<K extends core::Object = dynamic> = <A extends core::Object = dynamic>(core::int) → <B extends core::Object>(A, K, B) → core::int;
+typedef D<K extends core::Object = dynamic> = <A extends core::Object = dynamic>(core::int) → <B extends core::Object = dynamic>(A, K, B) → core::int;
 static method producer<K extends core::Object = dynamic>() → dynamic {
   return <A extends core::Object = dynamic>(core::int v1) → <B extends core::Object = dynamic>(A, self::producer::K, B) → core::int {
     return <B extends core::Object = dynamic>(A v2, self::producer::K v3, B v4) → core::int => 0;
   };
 }
 static method main() → dynamic {
-  assert(self::producer<core::String>() is <A extends core::Object>(core::int) → <B extends core::Object>(A, core::String, B) → core::int);
+  assert(self::producer<core::String>() is <A extends core::Object = dynamic>(core::int) → <B extends core::Object = dynamic>(A, core::String, B) → core::int);
 }
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart b/pkg/front_end/testcases/regress/issue_31846.dart
index 6ec5564..593212f 100644
--- a/pkg/front_end/testcases/regress/issue_31846.dart
+++ b/pkg/front_end/testcases/regress/issue_31846.dart
@@ -7,4 +7,7 @@
   print((<T>(T x) => x).runtimeType);
   print((<T extends num>(T x) => x).runtimeType);
   print((<T extends Comparable<T>>(T x) => x).runtimeType);
+  print((<T extends Comparable<S>, S>(T x) => x).runtimeType);
+  print((<T extends Function(T)>(T x) => x).runtimeType);
+  print((<T extends List<List<T>>>(T x) => x).runtimeType);
 }
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31846.dart.direct.expect
index 710cc04..f71d395 100644
--- a/pkg/front_end/testcases/regress/issue_31846.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31846.dart.direct.expect
@@ -7,4 +7,7 @@
   core::print((<T extends core::Object = dynamic>(T x) → dynamic => x).runtimeType);
   core::print((<T extends core::num = dynamic>(T x) → dynamic => x).runtimeType);
   core::print((<T extends core::Comparable<T> = dynamic>(T x) → dynamic => x).runtimeType);
+  core::print((<T extends core::Comparable<S> = dynamic, S extends core::Object = dynamic>(T x) → dynamic => x).runtimeType);
+  core::print((<T extends (T) → dynamic = dynamic>(T x) → dynamic => x).runtimeType);
+  core::print((<T extends core::List<core::List<T>> = dynamic>(T x) → dynamic => x).runtimeType);
 }
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31846.dart.direct.transformed.expect
index 710cc04..f71d395 100644
--- a/pkg/front_end/testcases/regress/issue_31846.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31846.dart.direct.transformed.expect
@@ -7,4 +7,7 @@
   core::print((<T extends core::Object = dynamic>(T x) → dynamic => x).runtimeType);
   core::print((<T extends core::num = dynamic>(T x) → dynamic => x).runtimeType);
   core::print((<T extends core::Comparable<T> = dynamic>(T x) → dynamic => x).runtimeType);
+  core::print((<T extends core::Comparable<S> = dynamic, S extends core::Object = dynamic>(T x) → dynamic => x).runtimeType);
+  core::print((<T extends (T) → dynamic = dynamic>(T x) → dynamic => x).runtimeType);
+  core::print((<T extends core::List<core::List<T>> = dynamic>(T x) → dynamic => x).runtimeType);
 }
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31846.dart.strong.expect
index 6f08277..b07df45 100644
--- a/pkg/front_end/testcases/regress/issue_31846.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31846.dart.strong.expect
@@ -7,4 +7,7 @@
   core::print((<T extends core::Object = dynamic>(T x) → T => x).{core::Object::runtimeType});
   core::print((<T extends core::num = core::num>(T x) → T => x).{core::Object::runtimeType});
   core::print((<T extends core::Comparable<T> = core::Comparable<dynamic>>(T x) → T => x).{core::Object::runtimeType});
+  core::print((<T extends core::Comparable<S> = core::Comparable<dynamic>, S extends core::Object = dynamic>(T x) → T => x).{core::Object::runtimeType});
+  core::print((<T extends (T) → dynamic = (core::Null) → dynamic>(T x) → T => x).{core::Object::runtimeType});
+  core::print((<T extends core::List<core::List<T>> = core::List<core::List<dynamic>>>(T x) → T => x).{core::Object::runtimeType});
 }
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect
index 6f08277..b07df45 100644
--- a/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect
@@ -7,4 +7,7 @@
   core::print((<T extends core::Object = dynamic>(T x) → T => x).{core::Object::runtimeType});
   core::print((<T extends core::num = core::num>(T x) → T => x).{core::Object::runtimeType});
   core::print((<T extends core::Comparable<T> = core::Comparable<dynamic>>(T x) → T => x).{core::Object::runtimeType});
+  core::print((<T extends core::Comparable<S> = core::Comparable<dynamic>, S extends core::Object = dynamic>(T x) → T => x).{core::Object::runtimeType});
+  core::print((<T extends (T) → dynamic = (core::Null) → dynamic>(T x) → T => x).{core::Object::runtimeType});
+  core::print((<T extends core::List<core::List<T>> = core::List<core::List<dynamic>>>(T x) → T => x).{core::Object::runtimeType});
 }
diff --git a/pkg/front_end/tool/_fasta/command_line.dart b/pkg/front_end/tool/_fasta/command_line.dart
index c804b1e..b34bcdf 100644
--- a/pkg/front_end/tool/_fasta/command_line.dart
+++ b/pkg/front_end/tool/_fasta/command_line.dart
@@ -212,7 +212,7 @@
   "--sdk": Uri,
   "--strong": "--strong-mode",
   "--strong-mode": false,
-  "--sync-async": false,
+  "--sync-async": true,
   "--target": String,
   "--verbose": false,
   "--verify": false,
diff --git a/pkg/front_end/tool/_fasta/compile_platform.dart b/pkg/front_end/tool/_fasta/compile_platform.dart
index 1b47a33..fd26f5f 100644
--- a/pkg/front_end/tool/_fasta/compile_platform.dart
+++ b/pkg/front_end/tool/_fasta/compile_platform.dart
@@ -44,8 +44,8 @@
       await compilePlatform(arguments);
     } on deprecated_InputError catch (e) {
       exitCode = 1;
-      CompilerContext.runWithDefaultOptions(
-          (c) => c.report(deprecated_InputError.toMessage(e), Severity.error));
+      await CompilerContext.runWithDefaultOptions((c) => new Future<void>.sync(
+          () => c.report(deprecated_InputError.toMessage(e), Severity.error)));
       return null;
     }
   }
diff --git a/pkg/front_end/tool/_fasta/entry_points.dart b/pkg/front_end/tool/_fasta/entry_points.dart
index 026bccd..b2a1d8f 100644
--- a/pkg/front_end/tool/_fasta/entry_points.dart
+++ b/pkg/front_end/tool/_fasta/entry_points.dart
@@ -121,8 +121,8 @@
       return await withGlobalOptions("compile", arguments, true,
           (CompilerContext c, _) => batchCompileImpl(c));
     } on deprecated_InputError catch (e) {
-      CompilerContext.runWithDefaultOptions(
-          (c) => c.report(deprecated_InputError.toMessage(e), Severity.error));
+      await CompilerContext.runWithDefaultOptions((c) => new Future<void>.sync(
+          () => c.report(deprecated_InputError.toMessage(e), Severity.error)));
       return false;
     }
   }
@@ -173,8 +173,8 @@
     });
   } on deprecated_InputError catch (e) {
     exitCode = 1;
-    CompilerContext.runWithDefaultOptions(
-        (c) => c.report(deprecated_InputError.toMessage(e), Severity.error));
+    await CompilerContext.runWithDefaultOptions((c) => new Future<void>.sync(
+        () => c.report(deprecated_InputError.toMessage(e), Severity.error)));
     return null;
   }
 }
@@ -192,8 +192,8 @@
     });
   } on deprecated_InputError catch (e) {
     exitCode = 1;
-    CompilerContext.runWithDefaultOptions(
-        (c) => c.report(deprecated_InputError.toMessage(e), Severity.error));
+    await CompilerContext.runWithDefaultOptions((c) => new Future<void>.sync(
+        () => c.report(deprecated_InputError.toMessage(e), Severity.error)));
     return null;
   }
 }
diff --git a/pkg/kernel/lib/type_algebra.dart b/pkg/kernel/lib/type_algebra.dart
index 821f9d5..8b47a74 100644
--- a/pkg/kernel/lib/type_algebra.dart
+++ b/pkg/kernel/lib/type_algebra.dart
@@ -229,12 +229,9 @@
   }
   for (int i = 0; i < typeParameters.length; ++i) {
     freshParameters[i].bound = substitute(typeParameters[i].bound, map);
-
-    // [defaultType] is populated using instantiate-to-bound algorithm, so it
-    // shouldn't refer to type parameters from the same declaration.  However,
-    // if a transformation changes [defaultType], it may get such references,
-    // and the line below should invoke [substitute], like for [bound] above.
-    freshParameters[i].defaultType = typeParameters[i].defaultType;
+    freshParameters[i].defaultType = typeParameters[i].defaultType != null
+        ? substitute(typeParameters[i].defaultType, map)
+        : null;
   }
   return new FreshTypeParameters(freshParameters, Substitution.fromMap(map));
 }
@@ -479,6 +476,9 @@
     var fresh = new TypeParameter(node.name);
     substitution[node] = new TypeParameterType(fresh);
     fresh.bound = visit(node.bound);
+    if (node.defaultType != null) {
+      fresh.defaultType = visit(node.defaultType);
+    }
     return fresh;
   }
 }
@@ -846,7 +846,9 @@
 
   bool handleTypeParameter(TypeParameter node) {
     assert(!variables.contains(node));
-    return node.bound.accept(this);
+    if (node.bound.accept(this)) return true;
+    if (node.defaultType == null) return false;
+    return node.defaultType.accept(this);
   }
 }
 
@@ -882,6 +884,7 @@
   visitFunctionType(FunctionType node) {
     for (TypeParameter typeParameter in node.typeParameters) {
       typeParameter.bound.accept(this);
+      typeParameter.defaultType?.accept(this);
     }
     for (DartType parameter in node.positionalParameters) {
       parameter.accept(this);
diff --git a/pkg/kernel/test/class_hierarchy_test.dart b/pkg/kernel/test/class_hierarchy_test.dart
index 439da52..2327eca 100644
--- a/pkg/kernel/test/class_hierarchy_test.dart
+++ b/pkg/kernel/test/class_hierarchy_test.dart
@@ -237,7 +237,7 @@
     var supertype =
         extends_ != null ? extends_(typeParameterTypes) : objectSuper;
     var implementedTypes =
-        implements_ != null ? implements_(typeParameterTypes) : [];
+        implements_ != null ? implements_(typeParameterTypes) : <Supertype>[];
     return addClass(new Class(
         name: name,
         typeParameters: typeParameters,
diff --git a/pkg/pkg.status b/pkg/pkg.status
index ded000c..1ff41ca 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -113,6 +113,9 @@
 front_end/test/src/incremental/hot_reload_e2e_test: Skip
 vm/test/*: SkipByDesign # Only meant to run on vm
 
+[ $system == linux ]
+analysis_server/test/integration/analysis/package_root_test: Pass, RuntimeError # Issue 33382
+
 [ $system == windows ]
 front_end/test/fasta/ast_builder_test: Pass, Slow, Timeout
 front_end/test/fasta/bootstrap_test: Skip # Issue 31902
diff --git a/pkg/status_file/lib/canonical_status_file.dart b/pkg/status_file/lib/canonical_status_file.dart
index 148b4ca..dd55368 100644
--- a/pkg/status_file/lib/canonical_status_file.dart
+++ b/pkg/status_file/lib/canonical_status_file.dart
@@ -161,7 +161,7 @@
     }
 
     var implicitSectionHeaderComments = sectionHeaderComments;
-    var entries = [];
+    var entries = <Entry>[];
     if (lastEmptyLine > 0 && sectionHeaderMatch(_lineCount) != null) {
       // Comments after the last empty line belong to the next section's header.
       // The empty line is not added to the section header, because it will be
diff --git a/pkg/status_file/lib/expectation.dart b/pkg/status_file/lib/expectation.dart
index bedbabd..6e94845 100644
--- a/pkg/status_file/lib/expectation.dart
+++ b/pkg/status_file/lib/expectation.dart
@@ -188,7 +188,7 @@
     skipByDesign,
     ignore,
     verificationError,
-  ], key: (Expectation expectation) => expectation._name.toLowerCase());
+  ], key: (expectation) => expectation._name.toLowerCase());
 
   /// Looks up the expectation with [name].
   static Expectation find(String name) {
diff --git a/pkg/vm/bin/gen_kernel.dart b/pkg/vm/bin/gen_kernel.dart
index 16212bf..151be0e 100644
--- a/pkg/vm/bin/gen_kernel.dart
+++ b/pkg/vm/bin/gen_kernel.dart
@@ -28,7 +28,8 @@
           'Produce kernel file for AOT compilation (enables global transformations).',
       defaultsTo: false)
   ..addFlag('strong-mode', help: 'Enable strong mode', defaultsTo: true)
-  ..addFlag('sync-async', help: 'Start `async` functions synchronously')
+  ..addFlag('sync-async',
+      help: 'Start `async` functions synchronously', defaultsTo: true)
   ..addFlag('embed-sources',
       help: 'Embed source files in the generated kernel component',
       defaultsTo: true)
diff --git a/pkg/vm/lib/bytecode/constant_pool.dart b/pkg/vm/lib/bytecode/constant_pool.dart
index a6fdf12..6de7663 100644
--- a/pkg/vm/lib/bytecode/constant_pool.dart
+++ b/pkg/vm/lib/bytecode/constant_pool.dart
@@ -405,9 +405,18 @@
   ConstantArgDesc(this.numArguments,
       {this.numTypeArgs = 0, this.argNames = const <String>[]});
 
-  ConstantArgDesc.fromArguments(Arguments args, {bool hasReceiver: false})
-      : this(args.positional.length + args.named.length + (hasReceiver ? 1 : 0),
-            numTypeArgs: args.types.length,
+  ConstantArgDesc.fromArguments(Arguments args,
+      {bool hasReceiver: false, bool isFactory: false})
+      : this(
+            args.positional.length +
+                args.named.length +
+                (hasReceiver ? 1 : 0) +
+                // VM expects that type arguments vector passed to a factory
+                // constructor is counted in numArguments, and not counted in
+                // numTypeArgs.
+                // TODO(alexmarkov): Clean this up.
+                (isFactory ? 1 : 0),
+            numTypeArgs: isFactory ? 0 : args.types.length,
             argNames: new List<String>.from(args.named.map((ne) => ne.name)));
 
   @override
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 51f5fdc..d2d12b3 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -11,6 +11,8 @@
 import 'package:kernel/library_index.dart' show LibraryIndex;
 import 'package:kernel/transformations/constants.dart'
     show ConstantEvaluator, ConstantsBackend, EvaluationEnvironment;
+import 'package:kernel/type_algebra.dart'
+    show Substitution, containsTypeVariable;
 import 'package:kernel/type_environment.dart' show TypeEnvironment;
 import 'package:kernel/vm/constants_native_effects.dart'
     show VmConstantsBackend;
@@ -57,6 +59,9 @@
 
   Class enclosingClass;
   Member enclosingMember;
+  Set<TypeParameter> classTypeParameters;
+  Set<TypeParameter> functionTypeParameters;
+  List<DartType> instantiatorTypeArguments;
   LocalVariables locals;
   ConstantEvaluator constantEvaluator;
   Map<LabeledStatement, Label> labeledStatements;
@@ -259,15 +264,17 @@
   }
 
   void _genStaticCallWithArgs(Member target, Arguments args,
-      {bool hasReceiver: false, bool alwaysPassTypeArgs: false}) {
-    final ConstantArgDesc argDesc =
-        new ConstantArgDesc.fromArguments(args, hasReceiver: hasReceiver);
+      {bool hasReceiver: false, bool isFactory: false}) {
+    final ConstantArgDesc argDesc = new ConstantArgDesc.fromArguments(args,
+        hasReceiver: hasReceiver, isFactory: isFactory);
 
     int totalArgCount = args.positional.length + args.named.length;
     if (hasReceiver) {
       totalArgCount++;
     }
-    if (args.types.isNotEmpty || alwaysPassTypeArgs) {
+    if (args.types.isNotEmpty || isFactory) {
+      // VM needs type arguments for every invocation of a factory constructor.
+      // TODO(alexmarkov): Clean this up.
       totalArgCount++;
     }
 
@@ -285,31 +292,45 @@
   }
 
   void _genTypeArguments(List<DartType> typeArgs, {Class instantiatingClass}) {
-    int typeArgsCPIndex = cp.add(new ConstantTypeArguments(typeArgs));
-    if (instantiatingClass != null) {
-      typeArgsCPIndex = cp.add(new ConstantTypeArgumentsForInstanceAllocation(
-          instantiatingClass, typeArgsCPIndex));
+    int typeArgsCPIndex() {
+      int cpIndex = cp.add(new ConstantTypeArguments(typeArgs));
+      if (instantiatingClass != null) {
+        cpIndex = cp.add(new ConstantTypeArgumentsForInstanceAllocation(
+            instantiatingClass, cpIndex));
+      }
+      return cpIndex;
     }
+
     if (typeArgs.isEmpty || !hasTypeParameters(typeArgs)) {
-      asm.emitPushConstant(typeArgsCPIndex);
+      asm.emitPushConstant(typeArgsCPIndex());
     } else {
-      // TODO(alexmarkov): try to reuse instantiator type arguments
-      _genPushInstantiatorAndFunctionTypeArguments(typeArgs);
-      asm.emitInstantiateTypeArgumentsTOS(1, typeArgsCPIndex);
+      if (_canReuseInstantiatorTypeArguments(typeArgs, instantiatingClass)) {
+        _genPushInstantiatorTypeArguments();
+      } else {
+        _genPushInstantiatorAndFunctionTypeArguments(typeArgs);
+        asm.emitInstantiateTypeArgumentsTOS(1, typeArgsCPIndex());
+      }
     }
   }
 
   void _genPushInstantiatorAndFunctionTypeArguments(List<DartType> types) {
-    // TODO(alexmarkov): do not load instantiator type arguments / function type
-    // arguments if they are not needed for these particular [types].
-    _genPushInstantiatorTypeArguments();
-    _genPushFunctionTypeArguments();
+    if (classTypeParameters != null &&
+        types.any((t) => containsTypeVariable(t, classTypeParameters))) {
+      assert(instantiatorTypeArguments != null);
+      _genPushInstantiatorTypeArguments();
+    } else {
+      _genPushNull();
+    }
+    if (functionTypeParameters != null &&
+        types.any((t) => containsTypeVariable(t, functionTypeParameters))) {
+      _genPushFunctionTypeArguments();
+    } else {
+      _genPushNull();
+    }
   }
 
   void _genPushInstantiatorTypeArguments() {
-    // TODO(alexmarkov): access to type arguments in factory constructors.
-    if ((enclosingMember.isInstanceMember || enclosingMember is Constructor) &&
-        hasInstantiatorTypeArguments(enclosingClass)) {
+    if (instantiatorTypeArguments != null) {
       _genPushReceiver();
       final int cpIndex =
           cp.add(new ConstantTypeArgumentsFieldOffset(enclosingClass));
@@ -319,6 +340,48 @@
     }
   }
 
+  List<DartType> _flattenInstantiatorTypeArguments(
+      Class instantiatedClass, List<DartType> typeArgs) {
+    assert(typeArgs.length == instantiatedClass.typeParameters.length);
+
+    List<DartType> flatTypeArgs;
+    final supertype = instantiatedClass.supertype;
+    if (supertype == null) {
+      flatTypeArgs = <DartType>[];
+    } else {
+      final substitution =
+          Substitution.fromPairs(instantiatedClass.typeParameters, typeArgs);
+      flatTypeArgs = _flattenInstantiatorTypeArguments(supertype.classNode,
+          substitution.substituteSupertype(supertype).typeArguments);
+    }
+    flatTypeArgs.addAll(typeArgs);
+    return flatTypeArgs;
+  }
+
+  bool _canReuseInstantiatorTypeArguments(
+      List<DartType> typeArgs, Class instantiatingClass) {
+    if (instantiatorTypeArguments == null) {
+      return false;
+    }
+
+    if (instantiatingClass != null) {
+      typeArgs =
+          _flattenInstantiatorTypeArguments(instantiatingClass, typeArgs);
+    }
+
+    if (typeArgs.length > instantiatorTypeArguments.length) {
+      return false;
+    }
+
+    for (int i = 0; i < typeArgs.length; ++i) {
+      if (typeArgs[i] != instantiatorTypeArguments[i]) {
+        return false;
+      }
+    }
+
+    return true;
+  }
+
   void _genPushFunctionTypeArguments() {
     if (locals.hasTypeArgsVar) {
       asm.emitPush(locals.typeArgsVarIndexInFrame);
@@ -440,6 +503,24 @@
   void start(Member node) {
     enclosingClass = node.enclosingClass;
     enclosingMember = node;
+    if (enclosingMember.isInstanceMember || enclosingMember is Constructor) {
+      if (enclosingClass.typeParameters.isNotEmpty) {
+        classTypeParameters =
+            new Set<TypeParameter>.from(enclosingClass.typeParameters);
+      }
+      if (hasInstantiatorTypeArguments(enclosingClass)) {
+        final typeParameters = enclosingClass.typeParameters
+            .map((p) => new TypeParameterType(p))
+            .toList();
+        instantiatorTypeArguments =
+            _flattenInstantiatorTypeArguments(enclosingClass, typeParameters);
+      }
+    }
+    if (enclosingMember.function != null &&
+        enclosingMember.function.typeParameters.isNotEmpty) {
+      functionTypeParameters =
+          new Set<TypeParameter>.from(enclosingMember.function.typeParameters);
+    }
     locals = new LocalVariables(node);
     // TODO(alexmarkov): improve caching in ConstantEvaluator and reuse it
     constantEvaluator = new ConstantEvaluator(constantsBackend, typeEnvironment,
@@ -496,6 +577,9 @@
 
     enclosingClass = null;
     enclosingMember = null;
+    classTypeParameters = null;
+    functionTypeParameters = null;
+    instantiatorTypeArguments = null;
     locals = null;
     constantEvaluator = null;
     labeledStatements = null;
@@ -610,6 +694,12 @@
     _pushAssemblerState();
 
     locals.enterScope(node);
+
+    if (function.typeParameters.isNotEmpty) {
+      functionTypeParameters ??= new Set<TypeParameter>();
+      functionTypeParameters.addAll(function.typeParameters);
+    }
+
     List<Label> savedYieldPoints = yieldPoints;
     yieldPoints = locals.isSyncYieldingFrame ? <Label>[] : null;
 
@@ -644,6 +734,10 @@
 
     cp.add(new ConstantEndClosureFunctionScope());
 
+    if (function.typeParameters.isNotEmpty) {
+      functionTypeParameters.removeAll(function.typeParameters);
+    }
+
     locals.leaveScope();
 
     closures.add(new ClosureBytecode(
@@ -1217,16 +1311,13 @@
   @override
   visitStaticInvocation(StaticInvocation node) {
     final args = node.arguments;
-    bool alwaysPassTypeArgs = false;
     if (node.target.isFactory && args.types.isEmpty) {
       // VM needs type arguments for every invocation of a factory constructor.
-      // TODO(alexmarkov): Why? Clean this up.
+      // TODO(alexmarkov): Clean this up.
       _genPushNull();
-      alwaysPassTypeArgs = true;
     }
     _genArguments(null, args);
-    _genStaticCallWithArgs(node.target, args,
-        alwaysPassTypeArgs: alwaysPassTypeArgs);
+    _genStaticCallWithArgs(node.target, args, isFactory: node.target.isFactory);
   }
 
   @override
diff --git a/pkg/vm/lib/bytecode/local_vars.dart b/pkg/vm/lib/bytecode/local_vars.dart
index 14ed800..d779939 100644
--- a/pkg/vm/lib/bytecode/local_vars.dart
+++ b/pkg/vm/lib/bytecode/local_vars.dart
@@ -724,6 +724,7 @@
 
   void _allocateParameters(TreeNode node, FunctionNode function) {
     final bool hasTypeArgs = function.typeParameters.isNotEmpty;
+    final bool isFactory = node is Procedure && node.isFactory;
     final bool hasReceiver =
         node is Constructor || (node is Procedure && !node.isStatic);
     final bool hasClosureArg =
@@ -731,7 +732,7 @@
 
     _currentFrame.numParameters = function.positionalParameters.length +
         function.namedParameters.length +
-        (hasTypeArgs ? 1 : 0) +
+        (hasTypeArgs || isFactory ? 1 : 0) +
         (hasReceiver ? 1 : 0) +
         (hasClosureArg ? 1 : 0);
 
@@ -748,6 +749,10 @@
     if (hasTypeArgs) {
       assert(!locals.isCaptured(_currentFrame.typeArgsVar));
       _allocateParameter(_currentFrame.typeArgsVar, count++);
+    } else if (isFactory) {
+      // Null type arguments are passed to factory constructors even if class
+      // is not generic. TODO(alexmarkov): Clean this up.
+      count++;
     }
     if (hasReceiver) {
       _allocateParameter(_currentFrame.receiverVar, count++);
diff --git a/pkg/vm/lib/frontend_server.dart b/pkg/vm/lib/frontend_server.dart
index 0bf5ffb..38b2e10 100644
--- a/pkg/vm/lib/frontend_server.dart
+++ b/pkg/vm/lib/frontend_server.dart
@@ -48,7 +48,7 @@
       help: 'Run compiler in strong mode (uses strong mode semantics)',
       defaultsTo: false)
   ..addFlag('sync-async',
-      help: 'Start `async` functions synchronously.', defaultsTo: false)
+      help: 'Start `async` functions synchronously.', defaultsTo: true)
   ..addFlag('tfa',
       help:
           'Enable global type flow analysis and related transformations in AOT mode.',
diff --git a/pkg/vm/lib/transformations/type_flow/entry_points.json b/pkg/vm/lib/transformations/type_flow/entry_points.json
index 5465003..49ac98a 100644
--- a/pkg/vm/lib/transformations/type_flow/entry_points.json
+++ b/pkg/vm/lib/transformations/type_flow/entry_points.json
@@ -52,11 +52,6 @@
     },
     {
       "library": "dart:core",
-      "class": "_Bigint",
-      "action": "create-instance"
-    },
-    {
-      "library": "dart:core",
       "class": "_Double",
       "action": "create-instance"
     },
@@ -970,11 +965,6 @@
       "action": "call"
     },
     {
-      "library": "dart:vmservice_io",
-      "name": "main",
-      "action": "call"
-    },
-    {
       "library": "dart:_builtin",
       "name": "_isolateId",
       "action": "get"
@@ -1016,6 +1006,16 @@
     },
     {
       "library": "dart:vmservice_io",
+      "name": "_deterministic",
+      "action": "get"
+    },
+    {
+      "library": "dart:vmservice_io",
+      "name": "_deterministic",
+      "action": "set"
+    },
+    {
+      "library": "dart:vmservice_io",
       "name": "_ip",
       "action": "get"
     },
@@ -1638,30 +1638,6 @@
         "nullable": false
       }
     ],
-    "Bigint_getNeg": [
-      {
-        "action": "return",
-        "library": "dart:core",
-        "class": "bool",
-        "nullable": false
-      }
-    ],
-    "Bigint_getUsed": [
-      {
-        "action": "return",
-        "library": "dart:core",
-        "class": "_Smi",
-        "nullable": false
-      }
-    ],
-    "Bigint_getDigits": [
-      {
-        "action": "return",
-        "library": "dart:typed_data",
-        "class": "_Uint32List",
-        "nullable": false
-      }
-    ],
     "LinkedHashMap_getIndex": [
       {
         "action": "return",
diff --git a/pkg/vm/test/frontend_server_test.dart b/pkg/vm/test/frontend_server_test.dart
index bfd1219..997bdf9 100644
--- a/pkg/vm/test/frontend_server_test.dart
+++ b/pkg/vm/test/frontend_server_test.dart
@@ -69,16 +69,16 @@
       )).captured;
       expect(capturedArgs.single['sdk-root'], equals('sdkroot'));
       expect(capturedArgs.single['strong'], equals(true));
-      expect(capturedArgs.single['sync-async'], equals(false));
+      expect(capturedArgs.single['sync-async'], equals(true));
     });
 
-    test('compile from command line (sync-async)', () async {
+    test('compile from command line (no-sync-async)', () async {
       final List<String> args = <String>[
         'server.dart',
         '--sdk-root',
         'sdkroot',
         '--strong',
-        '--sync-async',
+        '--no-sync-async',
       ];
       final int exitcode = await starter(args, compiler: compiler);
       expect(exitcode, equals(0));
@@ -89,7 +89,7 @@
       )).captured;
       expect(capturedArgs.single['sdk-root'], equals('sdkroot'));
       expect(capturedArgs.single['strong'], equals(true));
-      expect(capturedArgs.single['sync-async'], equals(true));
+      expect(capturedArgs.single['sync-async'], equals(false));
     });
 
     test('compile from command line with link platform', () async {
diff --git a/pkg/vm/testcases/bytecode/async.dart.expect b/pkg/vm/testcases/bytecode/async.dart.expect
index cf1e13f..f9bc6de 100644
--- a/pkg/vm/testcases/bytecode/async.dart.expect
+++ b/pkg/vm/testcases/bytecode/async.dart.expect
@@ -49,28 +49,28 @@
   StoreFieldTOS        CP#11
   PopLocal             r5
   Push                 r5
-  PushConstant         CP#24
-  IndirectStaticCall   1, CP#23
+  PushConstant         CP#23
+  IndirectStaticCall   1, CP#2
   StoreLocal           r2
   Drop1
   Push                 r5
-  PushConstant         CP#25
-  IndirectStaticCall   1, CP#23
+  PushConstant         CP#24
+  IndirectStaticCall   1, CP#2
   StoreLocal           r3
   Drop1
   Push                 r5
-  PushConstant         CP#26
-  IndirectStaticCall   1, CP#23
+  PushConstant         CP#25
+  IndirectStaticCall   1, CP#2
   StoreLocal           r4
   Drop1
-  PushConstant         CP#27
+  PushConstant         CP#26
   Push                 r5
-  PushConstant         CP#29
-  IndirectStaticCall   2, CP#28
+  PushConstant         CP#27
+  IndirectStaticCall   2, CP#13
   Drop1
   Push                 r0
   LoadFieldTOS         CP#4
-  InstanceCall1        1, CP#30
+  InstanceCall1        1, CP#28
   ReturnTOS
   Push                 r0
   LoadFieldTOS         CP#0
@@ -81,7 +81,7 @@
 ConstantPool {
   [0] = ContextOffset parent
   [1] = TypeArgs [dart.core::int]
-  [2] = ArgDesc num-args 0, num-type-args 1, names []
+  [2] = ArgDesc num-args 1, num-type-args 0, names []
   [3] = StaticICData target 'dart.async::Completer::sync', arg-desc CP#2
   [4] = ContextOffset var [3]
   [5] = Null
@@ -102,14 +102,12 @@
   [20] = FieldOffset dart.core::_Closure::_instantiator_type_arguments
   [21] = FieldOffset dart.core::_Closure::_function_type_arguments
   [22] = FieldOffset dart.core::_Closure::_function
-  [23] = ArgDesc num-args 1, num-type-args 0, names []
-  [24] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#23
-  [25] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#23
-  [26] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#23
-  [27] = TypeArgs [dynamic]
-  [28] = ArgDesc num-args 1, num-type-args 1, names []
-  [29] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#28
-  [30] = ICData get target-name 'future', arg-desc CP#23
+  [23] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#2
+  [24] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#2
+  [25] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#2
+  [26] = TypeArgs [dynamic]
+  [27] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#13
+  [28] = ICData get target-name 'future', arg-desc CP#2
 }
 Closure CP#10 {
   EntryOptional        1, 3, 0
@@ -266,15 +264,15 @@
   StoreFieldTOS        CP#17
   Push                 r0
   LoadFieldTOS         CP#17
-  PushConstant         CP#34
-  IndirectStaticCall   1, CP#33
+  PushConstant         CP#33
+  IndirectStaticCall   1, CP#4
   StoreLocal           r2
   Drop1
   Push                 r0
   Push                 r0
   LoadFieldTOS         CP#17
-  PushConstant         CP#35
-  IndirectStaticCall   1, CP#33
+  PushConstant         CP#34
+  IndirectStaticCall   1, CP#4
   StoreLocal           r3
   StoreFieldTOS        CP#9
   Push                 r3
@@ -282,21 +280,21 @@
   Push                 r0
   Push                 r0
   LoadFieldTOS         CP#17
-  PushConstant         CP#36
-  IndirectStaticCall   1, CP#33
+  PushConstant         CP#35
+  IndirectStaticCall   1, CP#4
   StoreLocal           r3
   StoreFieldTOS        CP#10
   Push                 r3
   Drop1
-  PushConstant         CP#37
+  PushConstant         CP#36
   Push                 r0
   LoadFieldTOS         CP#17
-  PushConstant         CP#39
-  IndirectStaticCall   2, CP#38
+  PushConstant         CP#37
+  IndirectStaticCall   2, CP#22
   Drop1
   Push                 r0
   LoadFieldTOS         CP#6
-  InstanceCall1        1, CP#40
+  InstanceCall1        1, CP#38
   ReturnTOS
   Push                 r0
   LoadFieldTOS         CP#0
@@ -309,7 +307,7 @@
   [1] = ContextOffset var [0]
   [2] = ContextOffset var [1]
   [3] = TypeArgs [dart.core::int]
-  [4] = ArgDesc num-args 0, num-type-args 1, names []
+  [4] = ArgDesc num-args 1, num-type-args 0, names []
   [5] = StaticICData target 'dart.async::Completer::sync', arg-desc CP#4
   [6] = ContextOffset var [8]
   [7] = Null
@@ -338,14 +336,12 @@
   [30] = FieldOffset dart.core::_Closure::_instantiator_type_arguments
   [31] = FieldOffset dart.core::_Closure::_function_type_arguments
   [32] = FieldOffset dart.core::_Closure::_function
-  [33] = ArgDesc num-args 1, num-type-args 0, names []
-  [34] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#33
-  [35] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#33
-  [36] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#33
-  [37] = TypeArgs [dynamic]
-  [38] = ArgDesc num-args 1, num-type-args 1, names []
-  [39] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#38
-  [40] = ICData get target-name 'future', arg-desc CP#33
+  [33] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#4
+  [34] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#4
+  [35] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#4
+  [36] = TypeArgs [dynamic]
+  [37] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#22
+  [38] = ICData get target-name 'future', arg-desc CP#4
 }
 Closure CP#14 {
   EntryOptional        1, 3, 0
@@ -565,54 +561,54 @@
   PushConstant         CP#6
   StoreFieldTOS        CP#14
   Push                 r0
-  Allocate             CP#43
+  Allocate             CP#42
   StoreLocal           r3
   Push                 r3
   PushConstant         CP#6
+  StoreFieldTOS        CP#43
+  Push                 r3
+  PushConstant         CP#6
   StoreFieldTOS        CP#44
   Push                 r3
-  PushConstant         CP#6
-  StoreFieldTOS        CP#45
-  Push                 r3
   PushConstant         CP#15
-  StoreFieldTOS        CP#46
+  StoreFieldTOS        CP#45
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#16
-  StoreFieldTOS        CP#29
+  StoreFieldTOS        CP#28
   Push                 r0
-  LoadFieldTOS         CP#29
-  PushConstant         CP#47
-  IndirectStaticCall   1, CP#21
+  LoadFieldTOS         CP#28
+  PushConstant         CP#46
+  IndirectStaticCall   1, CP#3
   StoreLocal           r2
   Drop1
   Push                 r0
   Push                 r0
-  LoadFieldTOS         CP#29
-  PushConstant         CP#48
-  IndirectStaticCall   1, CP#21
+  LoadFieldTOS         CP#28
+  PushConstant         CP#47
+  IndirectStaticCall   1, CP#3
   StoreLocal           r3
   StoreFieldTOS        CP#8
   Push                 r3
   Drop1
   Push                 r0
   Push                 r0
-  LoadFieldTOS         CP#29
-  PushConstant         CP#49
-  IndirectStaticCall   1, CP#21
+  LoadFieldTOS         CP#28
+  PushConstant         CP#48
+  IndirectStaticCall   1, CP#3
   StoreLocal           r3
   StoreFieldTOS        CP#9
   Push                 r3
   Drop1
-  PushConstant         CP#50
+  PushConstant         CP#49
   Push                 r0
-  LoadFieldTOS         CP#29
-  PushConstant         CP#52
-  IndirectStaticCall   2, CP#51
+  LoadFieldTOS         CP#28
+  PushConstant         CP#50
+  IndirectStaticCall   2, CP#18
   Drop1
   Push                 r0
   LoadFieldTOS         CP#5
-  InstanceCall1        1, CP#53
+  InstanceCall1        1, CP#51
   ReturnTOS
   Push                 r0
   LoadFieldTOS         CP#0
@@ -624,7 +620,7 @@
   [0] = ContextOffset parent
   [1] = ContextOffset var [0]
   [2] = TypeArgs [dart.core::int]
-  [3] = ArgDesc num-args 0, num-type-args 1, names []
+  [3] = ArgDesc num-args 1, num-type-args 0, names []
   [4] = StaticICData target 'dart.async::Completer::sync', arg-desc CP#3
   [5] = ContextOffset var [9]
   [6] = Null
@@ -642,39 +638,37 @@
   [18] = ArgDesc num-args 2, num-type-args 0, names []
   [19] = ICData target-name '<', arg-desc CP#18
   [20] = Bool true
-  [21] = ArgDesc num-args 1, num-type-args 0, names []
-  [22] = ICData get target-name 'iterator', arg-desc CP#21
-  [23] = ICData target-name 'moveNext', arg-desc CP#21
-  [24] = ICData get target-name 'current', arg-desc CP#21
-  [25] = ICData target-name '+', arg-desc CP#18
-  [26] = Int 1
-  [27] = ArgDesc num-args 0, num-type-args 0, names []
-  [28] = StaticICData target '#lib::foo', arg-desc CP#27
-  [29] = ContextOffset var [7]
-  [30] = ArgDesc num-args 4, num-type-args 0, names []
-  [31] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#30
+  [21] = ICData get target-name 'iterator', arg-desc CP#3
+  [22] = ICData target-name 'moveNext', arg-desc CP#3
+  [23] = ICData get target-name 'current', arg-desc CP#3
+  [24] = ICData target-name '+', arg-desc CP#18
+  [25] = Int 1
+  [26] = ArgDesc num-args 0, num-type-args 0, names []
+  [27] = StaticICData target '#lib::foo', arg-desc CP#26
+  [28] = ContextOffset var [7]
+  [29] = ArgDesc num-args 4, num-type-args 0, names []
+  [30] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#29
+  [31] = ICData target-name '+', arg-desc CP#18
   [32] = ICData target-name '+', arg-desc CP#18
   [33] = ICData target-name '+', arg-desc CP#18
-  [34] = ICData target-name '+', arg-desc CP#18
-  [35] = ICData target-name '<', arg-desc CP#18
+  [34] = ICData target-name '<', arg-desc CP#18
+  [35] = ICData target-name '+', arg-desc CP#18
   [36] = ICData target-name '+', arg-desc CP#18
-  [37] = ICData target-name '+', arg-desc CP#18
-  [38] = ICData target-name 'complete', arg-desc CP#18
-  [39] = Type dynamic
-  [40] = ArgDesc num-args 3, num-type-args 0, names []
-  [41] = ICData target-name 'completeError', arg-desc CP#40
-  [42] = EndClosureFunctionScope
-  [43] = Class dart.core::_Closure
-  [44] = FieldOffset dart.core::_Closure::_instantiator_type_arguments
-  [45] = FieldOffset dart.core::_Closure::_function_type_arguments
-  [46] = FieldOffset dart.core::_Closure::_function
-  [47] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#21
-  [48] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#21
-  [49] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#21
-  [50] = TypeArgs [dynamic]
-  [51] = ArgDesc num-args 1, num-type-args 1, names []
-  [52] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#51
-  [53] = ICData get target-name 'future', arg-desc CP#21
+  [37] = ICData target-name 'complete', arg-desc CP#18
+  [38] = Type dynamic
+  [39] = ArgDesc num-args 3, num-type-args 0, names []
+  [40] = ICData target-name 'completeError', arg-desc CP#39
+  [41] = EndClosureFunctionScope
+  [42] = Class dart.core::_Closure
+  [43] = FieldOffset dart.core::_Closure::_instantiator_type_arguments
+  [44] = FieldOffset dart.core::_Closure::_function_type_arguments
+  [45] = FieldOffset dart.core::_Closure::_function
+  [46] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#3
+  [47] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#3
+  [48] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#3
+  [49] = TypeArgs [dynamic]
+  [50] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#18
+  [51] = ICData get target-name 'future', arg-desc CP#3
 }
 Closure CP#15 {
   EntryOptional        1, 3, 0
@@ -735,7 +729,7 @@
   LoadFieldTOS         CP#0
   LoadFieldTOS         CP#0
   LoadFieldTOS         CP#1
-  InstanceCall1        1, CP#22
+  InstanceCall1        1, CP#21
   PopLocal             r8
   Push                 r4
   Push                 r8
@@ -745,7 +739,7 @@
   Push                 r4
   LoadFieldTOS         CP#1
   StoreLocal           r8
-  InstanceCall1        1, CP#23
+  InstanceCall1        1, CP#22
   PushConstant         CP#20
   IfNeStrictTOS
   Jump                 L3
@@ -757,7 +751,7 @@
   PopLocal             r4
   Push                 r4
   Push                 r8
-  InstanceCall1        1, CP#24
+  InstanceCall1        1, CP#23
   StoreFieldTOS        CP#1
   Push                 r4
   LoadFieldTOS         CP#0
@@ -784,7 +778,7 @@
   LoadFieldTOS         CP#1
   Push                 r4
   LoadFieldTOS         CP#1
-  InstanceCall1        2, CP#25
+  InstanceCall1        2, CP#24
   StoreLocal           r9
   StoreFieldTOS        CP#13
   Push                 r9
@@ -794,7 +788,7 @@
   LoadFieldTOS         CP#0
   LoadFieldTOS         CP#0
   LoadFieldTOS         CP#0
-  PushConstant         CP#26
+  PushConstant         CP#25
   StoreFieldTOS        CP#1
   Push                 r4
   LoadFieldTOS         CP#0
@@ -803,8 +797,8 @@
   LoadFieldTOS         CP#0
   Push                 r4
   StoreFieldTOS        CP#11
-  PushConstant         CP#28
-  IndirectStaticCall   0, CP#27
+  PushConstant         CP#27
+  IndirectStaticCall   0, CP#26
   Push                 r4
   LoadFieldTOS         CP#0
   LoadFieldTOS         CP#0
@@ -822,9 +816,9 @@
   LoadFieldTOS         CP#0
   LoadFieldTOS         CP#0
   LoadFieldTOS         CP#0
-  LoadFieldTOS         CP#29
-  PushConstant         CP#31
-  IndirectStaticCall   4, CP#30
+  LoadFieldTOS         CP#28
+  PushConstant         CP#30
+  IndirectStaticCall   4, CP#29
   PopLocal             r10
   PushConstant         CP#6
   ReturnTOS
@@ -852,8 +846,8 @@
   LoadFieldTOS         CP#0
   LoadFieldTOS         CP#13
   Push                 r1
+  InstanceCall1        2, CP#31
   InstanceCall1        2, CP#32
-  InstanceCall1        2, CP#33
   StoreLocal           r9
   StoreFieldTOS        CP#1
   Push                 r9
@@ -872,8 +866,8 @@
   Push                 r4
   Push                 r4
   LoadFieldTOS         CP#1
-  PushConstant         CP#26
-  InstanceCall1        2, CP#34
+  PushConstant         CP#25
+  InstanceCall1        2, CP#33
   StoreLocal           r8
   StoreFieldTOS        CP#1
   Push                 r8
@@ -889,7 +883,7 @@
   CheckStack
   Push                 r8
   PushConstant         CP#17
-  InstanceCall1        2, CP#35
+  InstanceCall1        2, CP#34
   PushConstant         CP#20
   IfNeStrictTOS
   Jump                 L7
@@ -897,14 +891,14 @@
   Push                 r4
   LoadFieldTOS         CP#1
   Push                 r8
-  InstanceCall1        2, CP#36
+  InstanceCall1        2, CP#35
   StoreLocal           r9
   StoreFieldTOS        CP#1
   Push                 r9
   Drop1
   Push                 r8
-  PushConstant         CP#26
-  InstanceCall1        2, CP#37
+  PushConstant         CP#25
+  InstanceCall1        2, CP#36
   StoreLocal           r8
   Drop1
   Jump                 L8
@@ -929,7 +923,7 @@
   LoadFieldTOS         CP#5
   Push                 r4
   LoadFieldTOS         CP#7
-  InstanceCall1        2, CP#38
+  InstanceCall1        2, CP#37
   Drop1
   PushConstant         CP#6
   ReturnTOS
@@ -952,7 +946,7 @@
   LoadFieldTOS         CP#5
   Push                 r8
   Push                 r9
-  InstanceCall1        3, CP#41
+  InstanceCall1        3, CP#40
   Drop1
   Jump                 L10
 L10:
@@ -1073,32 +1067,32 @@
   PushConstant         CP#8
   StoreFieldTOS        CP#3
   Push                 r0
-  Allocate             CP#52
+  Allocate             CP#51
   StoreLocal           r3
   Push                 r3
   PushConstant         CP#8
+  StoreFieldTOS        CP#52
+  Push                 r3
+  PushConstant         CP#8
   StoreFieldTOS        CP#53
   Push                 r3
-  PushConstant         CP#8
-  StoreFieldTOS        CP#54
-  Push                 r3
   PushConstant         CP#18
-  StoreFieldTOS        CP#55
+  StoreFieldTOS        CP#54
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#19
   StoreFieldTOS        CP#21
   Push                 r0
   LoadFieldTOS         CP#21
-  PushConstant         CP#56
-  IndirectStaticCall   1, CP#35
+  PushConstant         CP#55
+  IndirectStaticCall   1, CP#5
   StoreLocal           r2
   Drop1
   Push                 r0
   Push                 r0
   LoadFieldTOS         CP#21
-  PushConstant         CP#57
-  IndirectStaticCall   1, CP#35
+  PushConstant         CP#56
+  IndirectStaticCall   1, CP#5
   StoreLocal           r3
   StoreFieldTOS        CP#10
   Push                 r3
@@ -1106,21 +1100,21 @@
   Push                 r0
   Push                 r0
   LoadFieldTOS         CP#21
-  PushConstant         CP#58
-  IndirectStaticCall   1, CP#35
+  PushConstant         CP#57
+  IndirectStaticCall   1, CP#5
   StoreLocal           r3
   StoreFieldTOS        CP#11
   Push                 r3
   Drop1
-  PushConstant         CP#59
+  PushConstant         CP#58
   Push                 r0
   LoadFieldTOS         CP#21
-  PushConstant         CP#61
-  IndirectStaticCall   2, CP#60
+  PushConstant         CP#59
+  IndirectStaticCall   2, CP#24
   Drop1
   Push                 r0
   LoadFieldTOS         CP#7
-  InstanceCall1        1, CP#62
+  InstanceCall1        1, CP#60
   ReturnTOS
   Push                 r0
   LoadFieldTOS         CP#0
@@ -1134,7 +1128,7 @@
   [2] = ContextOffset var [1]
   [3] = ContextOffset var [2]
   [4] = TypeArgs [dart.core::int]
-  [5] = ArgDesc num-args 0, num-type-args 1, names []
+  [5] = ArgDesc num-args 1, num-type-args 0, names []
   [6] = StaticICData target 'dart.async::Completer::sync', arg-desc CP#5
   [7] = ContextOffset var [12]
   [8] = Null
@@ -1164,34 +1158,32 @@
   [32] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#22
   [33] = ICData target-name '+', arg-desc CP#24
   [34] = String 'fin'
-  [35] = ArgDesc num-args 1, num-type-args 0, names []
-  [36] = StaticICData target 'dart.core::print', arg-desc CP#35
-  [37] = Int 3
-  [38] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#22
-  [39] = ICData target-name '+', arg-desc CP#24
-  [40] = StaticICData target 'dart.core::print', arg-desc CP#35
-  [41] = Int 4
-  [42] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#22
-  [43] = ICData target-name '+', arg-desc CP#24
-  [44] = StaticICData target 'dart.core::print', arg-desc CP#35
-  [45] = Int 5
-  [46] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#22
-  [47] = ICData target-name '+', arg-desc CP#24
-  [48] = ICData target-name 'complete', arg-desc CP#24
-  [49] = ArgDesc num-args 3, num-type-args 0, names []
-  [50] = ICData target-name 'completeError', arg-desc CP#49
-  [51] = EndClosureFunctionScope
-  [52] = Class dart.core::_Closure
-  [53] = FieldOffset dart.core::_Closure::_instantiator_type_arguments
-  [54] = FieldOffset dart.core::_Closure::_function_type_arguments
-  [55] = FieldOffset dart.core::_Closure::_function
-  [56] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#35
-  [57] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#35
-  [58] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#35
-  [59] = TypeArgs [dynamic]
-  [60] = ArgDesc num-args 1, num-type-args 1, names []
-  [61] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#60
-  [62] = ICData get target-name 'future', arg-desc CP#35
+  [35] = StaticICData target 'dart.core::print', arg-desc CP#5
+  [36] = Int 3
+  [37] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#22
+  [38] = ICData target-name '+', arg-desc CP#24
+  [39] = StaticICData target 'dart.core::print', arg-desc CP#5
+  [40] = Int 4
+  [41] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#22
+  [42] = ICData target-name '+', arg-desc CP#24
+  [43] = StaticICData target 'dart.core::print', arg-desc CP#5
+  [44] = Int 5
+  [45] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#22
+  [46] = ICData target-name '+', arg-desc CP#24
+  [47] = ICData target-name 'complete', arg-desc CP#24
+  [48] = ArgDesc num-args 3, num-type-args 0, names []
+  [49] = ICData target-name 'completeError', arg-desc CP#48
+  [50] = EndClosureFunctionScope
+  [51] = Class dart.core::_Closure
+  [52] = FieldOffset dart.core::_Closure::_instantiator_type_arguments
+  [53] = FieldOffset dart.core::_Closure::_function_type_arguments
+  [54] = FieldOffset dart.core::_Closure::_function
+  [55] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#5
+  [56] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#5
+  [57] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#5
+  [58] = TypeArgs [dynamic]
+  [59] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#24
+  [60] = ICData get target-name 'future', arg-desc CP#5
 }
 Closure CP#18 {
   EntryOptional        1, 3, 0
@@ -1426,8 +1418,8 @@
   Push                 r9
   StoreFieldTOS        CP#17
   PushConstant         CP#34
-  PushConstant         CP#36
-  IndirectStaticCall   1, CP#35
+  PushConstant         CP#35
+  IndirectStaticCall   1, CP#5
   Drop1
   Push                 r4
   LoadFieldTOS         CP#0
@@ -1439,7 +1431,7 @@
   Drop1
   Push                 r4
   LoadFieldTOS         CP#0
-  PushConstant         CP#37
+  PushConstant         CP#36
   StoreFieldTOS        CP#1
   Push                 r4
   LoadFieldTOS         CP#0
@@ -1458,7 +1450,7 @@
   Push                 r4
   LoadFieldTOS         CP#0
   LoadFieldTOS         CP#21
-  PushConstant         CP#38
+  PushConstant         CP#37
   IndirectStaticCall   4, CP#22
   PopLocal             r12
   PushConstant         CP#8
@@ -1475,7 +1467,7 @@
   LoadFieldTOS         CP#0
   LoadFieldTOS         CP#3
   Push                 r1
-  InstanceCall1        2, CP#39
+  InstanceCall1        2, CP#38
   StoreLocal           r10
   StoreFieldTOS        CP#1
   Push                 r10
@@ -1507,8 +1499,8 @@
   LoadFieldTOS         CP#14
   PopLocal             r4
   PushConstant         CP#34
-  PushConstant         CP#40
-  IndirectStaticCall   1, CP#35
+  PushConstant         CP#39
+  IndirectStaticCall   1, CP#5
   Drop1
   Push                 r4
   LoadFieldTOS         CP#0
@@ -1520,7 +1512,7 @@
   Drop1
   Push                 r4
   LoadFieldTOS         CP#0
-  PushConstant         CP#41
+  PushConstant         CP#40
   StoreFieldTOS        CP#1
   Push                 r4
   LoadFieldTOS         CP#0
@@ -1539,7 +1531,7 @@
   Push                 r4
   LoadFieldTOS         CP#0
   LoadFieldTOS         CP#21
-  PushConstant         CP#42
+  PushConstant         CP#41
   IndirectStaticCall   4, CP#22
   PopLocal             r12
   PushConstant         CP#8
@@ -1556,7 +1548,7 @@
   LoadFieldTOS         CP#0
   LoadFieldTOS         CP#3
   Push                 r1
-  InstanceCall1        2, CP#43
+  InstanceCall1        2, CP#42
   StoreLocal           r10
   StoreFieldTOS        CP#1
   Push                 r10
@@ -1585,8 +1577,8 @@
   LoadFieldTOS         CP#14
   PopLocal             r4
   PushConstant         CP#34
-  PushConstant         CP#44
-  IndirectStaticCall   1, CP#35
+  PushConstant         CP#43
+  IndirectStaticCall   1, CP#5
   Drop1
   Push                 r4
   LoadFieldTOS         CP#0
@@ -1598,7 +1590,7 @@
   Drop1
   Push                 r4
   LoadFieldTOS         CP#0
-  PushConstant         CP#45
+  PushConstant         CP#44
   StoreFieldTOS        CP#1
   Push                 r4
   LoadFieldTOS         CP#0
@@ -1617,7 +1609,7 @@
   Push                 r4
   LoadFieldTOS         CP#0
   LoadFieldTOS         CP#21
-  PushConstant         CP#46
+  PushConstant         CP#45
   IndirectStaticCall   4, CP#22
   PopLocal             r12
   PushConstant         CP#8
@@ -1634,7 +1626,7 @@
   LoadFieldTOS         CP#0
   LoadFieldTOS         CP#3
   Push                 r1
-  InstanceCall1        2, CP#47
+  InstanceCall1        2, CP#46
   StoreLocal           r10
   StoreFieldTOS        CP#1
   Push                 r10
@@ -1659,7 +1651,7 @@
   LoadFieldTOS         CP#7
   Push                 r4
   LoadFieldTOS         CP#9
-  InstanceCall1        2, CP#48
+  InstanceCall1        2, CP#47
   Drop1
   PushConstant         CP#8
   ReturnTOS
@@ -1682,7 +1674,7 @@
   LoadFieldTOS         CP#7
   Push                 r8
   Push                 r9
-  InstanceCall1        3, CP#50
+  InstanceCall1        3, CP#49
   Drop1
   Jump                 L12
 L12:
@@ -1701,11 +1693,11 @@
   IfEqStrictNumTOS
   Jump                 L14
   Push                 r5
-  PushConstant         CP#37
+  PushConstant         CP#36
   IfEqStrictNumTOS
   Jump                 L15
   Push                 r5
-  PushConstant         CP#41
+  PushConstant         CP#40
   IfEqStrictNumTOS
   Jump                 L16
   Jump                 L17
@@ -1789,17 +1781,17 @@
   Push                 r0
   PushConstant         CP#2
   StoreFieldTOS        CP#1
-  Allocate             CP#36
+  Allocate             CP#35
   StoreLocal           r3
   Push                 r3
   PushConstant         CP#9
+  StoreFieldTOS        CP#36
+  Push                 r3
+  PushConstant         CP#9
   StoreFieldTOS        CP#37
   Push                 r3
-  PushConstant         CP#9
-  StoreFieldTOS        CP#38
-  Push                 r3
   PushConstant         CP#3
-  StoreFieldTOS        CP#39
+  StoreFieldTOS        CP#38
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#4
@@ -1819,7 +1811,7 @@
   [3] = ClosureFunction nested () → dart.async::Future<dart.core::int> /* originally async */ ;
   [4] = FieldOffset dart.core::_Closure::_context
   [5] = TypeArgs [dart.core::int]
-  [6] = ArgDesc num-args 0, num-type-args 1, names []
+  [6] = ArgDesc num-args 1, num-type-args 0, names []
   [7] = StaticICData target 'dart.async::Completer::sync', arg-desc CP#6
   [8] = ContextOffset var [8]
   [9] = Null
@@ -1841,26 +1833,24 @@
   [25] = ICData target-name '+', arg-desc CP#24
   [26] = Type dynamic
   [27] = String 'fin'
-  [28] = ArgDesc num-args 1, num-type-args 0, names []
-  [29] = StaticICData target 'dart.core::print', arg-desc CP#28
-  [30] = StaticICData target 'dart.core::print', arg-desc CP#28
-  [31] = StaticICData target 'dart.core::print', arg-desc CP#28
-  [32] = ICData target-name 'complete', arg-desc CP#24
-  [33] = ArgDesc num-args 3, num-type-args 0, names []
-  [34] = ICData target-name 'completeError', arg-desc CP#33
-  [35] = EndClosureFunctionScope
-  [36] = Class dart.core::_Closure
-  [37] = FieldOffset dart.core::_Closure::_instantiator_type_arguments
-  [38] = FieldOffset dart.core::_Closure::_function_type_arguments
-  [39] = FieldOffset dart.core::_Closure::_function
-  [40] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#28
-  [41] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#28
-  [42] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#28
-  [43] = TypeArgs [dynamic]
-  [44] = ArgDesc num-args 1, num-type-args 1, names []
-  [45] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#44
-  [46] = ICData get target-name 'future', arg-desc CP#28
-  [47] = EndClosureFunctionScope
+  [28] = StaticICData target 'dart.core::print', arg-desc CP#6
+  [29] = StaticICData target 'dart.core::print', arg-desc CP#6
+  [30] = StaticICData target 'dart.core::print', arg-desc CP#6
+  [31] = ICData target-name 'complete', arg-desc CP#24
+  [32] = ArgDesc num-args 3, num-type-args 0, names []
+  [33] = ICData target-name 'completeError', arg-desc CP#32
+  [34] = EndClosureFunctionScope
+  [35] = Class dart.core::_Closure
+  [36] = FieldOffset dart.core::_Closure::_instantiator_type_arguments
+  [37] = FieldOffset dart.core::_Closure::_function_type_arguments
+  [38] = FieldOffset dart.core::_Closure::_function
+  [39] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#6
+  [40] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#6
+  [41] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#6
+  [42] = TypeArgs [dynamic]
+  [43] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#24
+  [44] = ICData get target-name 'future', arg-desc CP#6
+  [45] = EndClosureFunctionScope
 }
 Closure CP#17 {
   EntryOptional        1, 3, 0
@@ -1964,8 +1954,8 @@
   MoveSpecial          r8, exception
   MoveSpecial          r9, stackTrace
   PushConstant         CP#27
-  PushConstant         CP#29
-  IndirectStaticCall   1, CP#28
+  PushConstant         CP#28
+  IndirectStaticCall   1, CP#6
   Drop1
   Push                 r8
   Push                 r9
@@ -1978,8 +1968,8 @@
   LoadFieldTOS         CP#16
   PopLocal             r4
   PushConstant         CP#27
-  PushConstant         CP#30
-  IndirectStaticCall   1, CP#28
+  PushConstant         CP#29
+  IndirectStaticCall   1, CP#6
   Drop1
   Push                 r4
   LoadFieldTOS         CP#0
@@ -1993,8 +1983,8 @@
   LoadFieldTOS         CP#16
   PopLocal             r4
   PushConstant         CP#27
-  PushConstant         CP#31
-  IndirectStaticCall   1, CP#28
+  PushConstant         CP#30
+  IndirectStaticCall   1, CP#6
   Drop1
   Push                 r4
   LoadFieldTOS         CP#0
@@ -2004,7 +1994,7 @@
   LoadFieldTOS         CP#8
   Push                 r4
   LoadFieldTOS         CP#10
-  InstanceCall1        2, CP#32
+  InstanceCall1        2, CP#31
   Drop1
   PushConstant         CP#9
   ReturnTOS
@@ -2027,7 +2017,7 @@
   LoadFieldTOS         CP#8
   Push                 r8
   Push                 r9
-  InstanceCall1        3, CP#34
+  InstanceCall1        3, CP#33
   Drop1
   Jump                 L5
 L5:
@@ -2082,32 +2072,32 @@
   PushConstant         CP#9
   StoreFieldTOS        CP#16
   Push                 r0
-  Allocate             CP#36
+  Allocate             CP#35
   StoreLocal           r3
   Push                 r3
   PushConstant         CP#9
+  StoreFieldTOS        CP#36
+  Push                 r3
+  PushConstant         CP#9
   StoreFieldTOS        CP#37
   Push                 r3
-  PushConstant         CP#9
-  StoreFieldTOS        CP#38
-  Push                 r3
   PushConstant         CP#17
-  StoreFieldTOS        CP#39
+  StoreFieldTOS        CP#38
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#4
   StoreFieldTOS        CP#21
   Push                 r0
   LoadFieldTOS         CP#21
-  PushConstant         CP#40
-  IndirectStaticCall   1, CP#28
+  PushConstant         CP#39
+  IndirectStaticCall   1, CP#6
   StoreLocal           r2
   Drop1
   Push                 r0
   Push                 r0
   LoadFieldTOS         CP#21
-  PushConstant         CP#41
-  IndirectStaticCall   1, CP#28
+  PushConstant         CP#40
+  IndirectStaticCall   1, CP#6
   StoreLocal           r3
   StoreFieldTOS        CP#11
   Push                 r3
@@ -2115,21 +2105,21 @@
   Push                 r0
   Push                 r0
   LoadFieldTOS         CP#21
-  PushConstant         CP#42
-  IndirectStaticCall   1, CP#28
+  PushConstant         CP#41
+  IndirectStaticCall   1, CP#6
   StoreLocal           r3
   StoreFieldTOS        CP#12
   Push                 r3
   Drop1
-  PushConstant         CP#43
+  PushConstant         CP#42
   Push                 r0
   LoadFieldTOS         CP#21
-  PushConstant         CP#45
-  IndirectStaticCall   2, CP#44
+  PushConstant         CP#43
+  IndirectStaticCall   2, CP#24
   Drop1
   Push                 r0
   LoadFieldTOS         CP#8
-  InstanceCall1        1, CP#46
+  InstanceCall1        1, CP#44
   ReturnTOS
   Push                 r0
   LoadFieldTOS         CP#0
diff --git a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
index 5ff4e07..c6c2c4e 100644
--- a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
+++ b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
@@ -654,7 +654,7 @@
   PushConstant         CP#0
   PushStatic           CP#0
   PushConstant         CP#14
-  IndirectStaticCall   2, CP#9
+  IndirectStaticCall   2, CP#2
   InstanceCall1        2, CP#15
   ReturnTOS
 L6:
@@ -676,7 +676,7 @@
   [11] = ArgDesc num-args 0, num-type-args 0, names []
   [12] = StaticICData get target 'dart.core::Uri::base', arg-desc CP#11
   [13] = Null
-  [14] = StaticICData target 'dart.core::_Uri::file', arg-desc CP#9
+  [14] = StaticICData target 'dart.core::_Uri::file', arg-desc CP#2
   [15] = ICData target-name 'resolveUri', arg-desc CP#2
 }
 ]static method _scriptUri() → core::Uri {
diff --git a/pkg/vm/testcases/bytecode/closures.dart.expect b/pkg/vm/testcases/bytecode/closures.dart.expect
index 7bf2d87..6f72b9f 100644
--- a/pkg/vm/testcases/bytecode/closures.dart.expect
+++ b/pkg/vm/testcases/bytecode/closures.dart.expect
@@ -228,7 +228,7 @@
   Push                 r2
   InstanceCall1        1, CP#52
   Drop1
-  PushConstant         CP#36
+  PushConstant         CP#18
   ReturnTOS
 }
 ConstantPool {
@@ -250,30 +250,30 @@
   [15] = Int 0
   [16] = Type #lib::A::T1
   [17] = TypeArgumentsFieldOffset #lib::A
-  [18] = Int 1
-  [19] = Type #lib::A::T2
-  [20] = Type #lib::A::foo::T3
-  [21] = Int 3
-  [22] = Type #lib::A::foo::T4
-  [23] = Type T5
-  [24] = Int 5
-  [25] = Type T6
-  [26] = Type T7
-  [27] = Int 7
-  [28] = Type T8
-  [29] = ArgDesc num-args 1, num-type-args 1, names []
-  [30] = StaticICData target 'dart.core::List::_fromLiteral', arg-desc CP#29
-  [31] = ArgDesc num-args 1, num-type-args 0, names []
-  [32] = StaticICData target 'dart.core::print', arg-desc CP#31
-  [33] = TypeArgs [#lib::A::T1, #lib::A::T2, #lib::A::foo::T3, #lib::A::foo::T4, T5, T6, T7, T8]
-  [34] = ArgDesc num-args 0, num-type-args 8, names []
-  [35] = StaticICData target '#lib::callWithArgs', arg-desc CP#34
-  [36] = Null
+  [18] = Null
+  [19] = Int 1
+  [20] = Type #lib::A::T2
+  [21] = Type #lib::A::foo::T3
+  [22] = Int 3
+  [23] = Type #lib::A::foo::T4
+  [24] = Type T5
+  [25] = Int 5
+  [26] = Type T6
+  [27] = Type T7
+  [28] = Int 7
+  [29] = Type T8
+  [30] = ArgDesc num-args 1, num-type-args 1, names []
+  [31] = StaticICData target 'dart.core::List::_fromLiteral', arg-desc CP#30
+  [32] = ArgDesc num-args 1, num-type-args 0, names []
+  [33] = StaticICData target 'dart.core::print', arg-desc CP#32
+  [34] = TypeArgs [#lib::A::T1, #lib::A::T2, #lib::A::foo::T3, #lib::A::foo::T4, T5, T6, T7, T8]
+  [35] = ArgDesc num-args 0, num-type-args 8, names []
+  [36] = StaticICData target '#lib::callWithArgs', arg-desc CP#35
   [37] = EndClosureFunctionScope
   [38] = Class dart.core::_Closure
   [39] = FieldOffset dart.core::_Closure::_instantiator_type_arguments
   [40] = FieldOffset dart.core::_Closure::_function
-  [41] = ICData target-name 'call', arg-desc CP#31
+  [41] = ICData target-name 'call', arg-desc CP#32
   [42] = EndClosureFunctionScope
   [43] = TypeArgs [#lib::C7, #lib::C8]
   [44] = ArgDesc num-args 1, num-type-args 2, names []
@@ -306,79 +306,67 @@
   Push                 r1
   LoadFieldTOS         CP#1
   LoadFieldTOS         CP#17
-  Push                 r0
+  PushConstant         CP#18
   InstantiateType      CP#16
   StoreIndexedTOS
   Push                 r3
+  PushConstant         CP#19
+  Push                 r1
+  LoadFieldTOS         CP#1
+  LoadFieldTOS         CP#17
   PushConstant         CP#18
-  Push                 r1
-  LoadFieldTOS         CP#1
-  LoadFieldTOS         CP#17
-  Push                 r0
-  InstantiateType      CP#19
-  StoreIndexedTOS
-  Push                 r3
-  PushConstant         CP#5
-  Push                 r1
-  LoadFieldTOS         CP#1
-  LoadFieldTOS         CP#17
-  Push                 r0
   InstantiateType      CP#20
   StoreIndexedTOS
   Push                 r3
-  PushConstant         CP#21
-  Push                 r1
-  LoadFieldTOS         CP#1
-  LoadFieldTOS         CP#17
+  PushConstant         CP#5
+  PushConstant         CP#18
   Push                 r0
-  InstantiateType      CP#22
+  InstantiateType      CP#21
   StoreIndexedTOS
   Push                 r3
-  PushConstant         CP#6
-  Push                 r1
-  LoadFieldTOS         CP#1
-  LoadFieldTOS         CP#17
+  PushConstant         CP#22
+  PushConstant         CP#18
   Push                 r0
   InstantiateType      CP#23
   StoreIndexedTOS
   Push                 r3
-  PushConstant         CP#24
-  Push                 r1
-  LoadFieldTOS         CP#1
-  LoadFieldTOS         CP#17
+  PushConstant         CP#6
+  PushConstant         CP#18
   Push                 r0
-  InstantiateType      CP#25
+  InstantiateType      CP#24
   StoreIndexedTOS
   Push                 r3
-  PushConstant         CP#10
-  Push                 r1
-  LoadFieldTOS         CP#1
-  LoadFieldTOS         CP#17
+  PushConstant         CP#25
+  PushConstant         CP#18
   Push                 r0
   InstantiateType      CP#26
   StoreIndexedTOS
   Push                 r3
-  PushConstant         CP#27
-  Push                 r1
-  LoadFieldTOS         CP#1
-  LoadFieldTOS         CP#17
+  PushConstant         CP#10
+  PushConstant         CP#18
   Push                 r0
-  InstantiateType      CP#28
+  InstantiateType      CP#27
   StoreIndexedTOS
-  PushConstant         CP#30
-  IndirectStaticCall   2, CP#29
-  PushConstant         CP#32
-  IndirectStaticCall   1, CP#31
+  Push                 r3
+  PushConstant         CP#28
+  PushConstant         CP#18
+  Push                 r0
+  InstantiateType      CP#29
+  StoreIndexedTOS
+  PushConstant         CP#31
+  IndirectStaticCall   2, CP#30
+  PushConstant         CP#33
+  IndirectStaticCall   1, CP#32
   Drop1
   Push                 r1
   LoadFieldTOS         CP#1
   LoadFieldTOS         CP#17
   Push                 r0
-  InstantiateTypeArgumentsTOS 1, CP#33
-  PushConstant         CP#35
-  IndirectStaticCall   1, CP#34
-  Drop1
+  InstantiateTypeArgumentsTOS 1, CP#34
   PushConstant         CP#36
+  IndirectStaticCall   1, CP#35
+  Drop1
+  PushConstant         CP#18
   ReturnTOS
 
 }
@@ -417,7 +405,7 @@
   Push                 r2
   InstanceCall1        1, CP#41
   Drop1
-  PushConstant         CP#36
+  PushConstant         CP#18
   ReturnTOS
 
 }
@@ -461,7 +449,7 @@
   Push                 r2
   InstanceCall1        1, CP#47
   Drop1
-  PushConstant         CP#36
+  PushConstant         CP#18
   ReturnTOS
 
 }
diff --git a/pkg/vm/testcases/bytecode/instance_creation.dart b/pkg/vm/testcases/bytecode/instance_creation.dart
index 98259da..5821f59 100644
--- a/pkg/vm/testcases/bytecode/instance_creation.dart
+++ b/pkg/vm/testcases/bytecode/instance_creation.dart
@@ -38,6 +38,35 @@
   new B<List<T>>();
 }
 
+class E<K, V> {
+  test_reuse1() => new Map<K, V>();
+}
+
+class F<K, V> extends E<String, List<V>> {
+  test_reuse2() => new Map<String, List<V>>();
+}
+
+class G<K, V> {
+  G();
+  factory G.test_factory() => new H<String, K, V>();
+}
+
+class H<P1, P2, P3> extends G<P2, P3> {}
+
+void foo4() {
+  new G<int, List<String>>.test_factory();
+}
+
+class I {
+  I(param);
+  factory I.test_factory2({param}) => new I(param);
+}
+
+void foo5() {
+  new I.test_factory2();
+  new I.test_factory2(param: 42);
+}
+
 main() {
   foo1();
   foo2();
diff --git a/pkg/vm/testcases/bytecode/instance_creation.dart.expect b/pkg/vm/testcases/bytecode/instance_creation.dart.expect
index 239c9ac..32c2c32 100644
--- a/pkg/vm/testcases/bytecode/instance_creation.dart.expect
+++ b/pkg/vm/testcases/bytecode/instance_creation.dart.expect
@@ -185,6 +185,206 @@
     core::print("C: ${s}");
   }
 }
+class E<K extends core::Object = dynamic, V extends core::Object = dynamic> extends core::Object {
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  PushConstant         CP#1
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [2] = Null
+}
+]  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  LoadFieldTOS         CP#0
+  PushConstant         CP#2
+  IndirectStaticCall   1, CP#1
+  ReturnTOS
+  PushConstant         CP#3
+  ReturnTOS
+}
+ConstantPool {
+  [0] = TypeArgumentsFieldOffset #lib::E
+  [1] = ArgDesc num-args 1, num-type-args 0, names []
+  [2] = StaticICData target 'dart.core::Map::', arg-desc CP#1
+  [3] = Null
+}
+]  method test_reuse1() → dynamic
+    return core::Map::•<self::E::K, self::E::V>();
+}
+class F<K extends core::Object = dynamic, V extends core::Object = dynamic> extends self::E<core::String, core::List<self::F::V>> {
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  PushConstant         CP#1
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = StaticICData target '#lib::E::', arg-desc CP#0
+  [2] = Null
+}
+]  synthetic constructor •() → void
+    : super self::E::•()
+    ;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  LoadFieldTOS         CP#0
+  PushConstant         CP#2
+  IndirectStaticCall   1, CP#1
+  ReturnTOS
+  PushConstant         CP#3
+  ReturnTOS
+}
+ConstantPool {
+  [0] = TypeArgumentsFieldOffset #lib::F
+  [1] = ArgDesc num-args 1, num-type-args 0, names []
+  [2] = StaticICData target 'dart.core::Map::', arg-desc CP#1
+  [3] = Null
+}
+]  method test_reuse2() → dynamic
+    return core::Map::•<core::String, core::List<self::F::V>>();
+}
+class G<K extends core::Object = dynamic, V extends core::Object = dynamic> extends core::Object {
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  PushConstant         CP#1
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [2] = Null
+}
+]  constructor •() → void
+    : super core::Object::•()
+    ;
+[@vm.bytecode=
+Bytecode {
+  Entry                1
+  CheckStack
+  PushConstant         CP#1
+  Push                 FP[-5]
+  InstantiateTypeArgumentsTOS 1, CP#3
+  PushConstant         CP#0
+  AllocateT
+  StoreLocal           r0
+  Push                 r0
+  PushConstant         CP#5
+  IndirectStaticCall   1, CP#4
+  Drop1
+  ReturnTOS
+  PushConstant         CP#1
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Class #lib::H
+  [1] = Null
+  [2] = TypeArgs [dart.core::String, #lib::G::test_factory::K, #lib::G::test_factory::V]
+  [3] = TypeArgumentsForInstanceAllocation #lib::H type-args CP#2
+  [4] = ArgDesc num-args 1, num-type-args 0, names []
+  [5] = StaticICData target '#lib::H::', arg-desc CP#4
+}
+]  static factory test_factory<K extends core::Object = dynamic, V extends core::Object = dynamic>() → self::G<self::G::test_factory::K, self::G::test_factory::V>
+    return new self::H::•<core::String, self::G::test_factory::K, self::G::test_factory::V>();
+}
+class H<P1 extends core::Object = dynamic, P2 extends core::Object = dynamic, P3 extends core::Object = dynamic> extends self::G<self::H::P2, self::H::P3> {
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  PushConstant         CP#1
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = StaticICData target '#lib::G::', arg-desc CP#0
+  [2] = Null
+}
+]  synthetic constructor •() → void
+    : super self::G::•()
+    ;
+}
+class I extends core::Object {
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-6]
+  PushConstant         CP#1
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [2] = Null
+}
+]  constructor •(dynamic param) → void
+    : super core::Object::•()
+    ;
+[@vm.bytecode=
+Bytecode {
+  EntryOptional        1, 0, 1
+  LoadConstant         r1, CP#0
+  LoadConstant         r1, CP#1
+  Frame                1
+  CheckStack
+  Allocate             CP#2
+  StoreLocal           r2
+  Push                 r2
+  Push                 r1
+  PushConstant         CP#4
+  IndirectStaticCall   2, CP#3
+  Drop1
+  ReturnTOS
+  PushConstant         CP#1
+  ReturnTOS
+}
+ConstantPool {
+  [0] = String 'param'
+  [1] = Null
+  [2] = Class #lib::I
+  [3] = ArgDesc num-args 2, num-type-args 0, names []
+  [4] = StaticICData target '#lib::I::', arg-desc CP#3
+}
+]  static factory test_factory2({dynamic param = null}) → self::I
+    return new self::I::•(param);
+}
 [@vm.bytecode=
 Bytecode {
   Entry                1
@@ -257,9 +457,9 @@
 Bytecode {
   Entry                1
   CheckStack
-  PushConstant         CP#3
+  PushConstant         CP#1
   Push                 FP[-5]
-  InstantiateTypeArgumentsTOS 1, CP#2
+  InstantiateTypeArgumentsTOS 1, CP#3
   PushConstant         CP#0
   AllocateT
   StoreLocal           r0
@@ -268,14 +468,14 @@
   IndirectStaticCall   1, CP#4
   Drop1
   Drop1
-  PushConstant         CP#3
+  PushConstant         CP#1
   ReturnTOS
 }
 ConstantPool {
   [0] = Class #lib::B
-  [1] = TypeArgs [dart.core::List<#lib::foo3::T>]
-  [2] = TypeArgumentsForInstanceAllocation #lib::B type-args CP#1
-  [3] = Null
+  [1] = Null
+  [2] = TypeArgs [dart.core::List<#lib::foo3::T>]
+  [3] = TypeArgumentsForInstanceAllocation #lib::B type-args CP#2
   [4] = ArgDesc num-args 1, num-type-args 0, names []
   [5] = StaticICData target '#lib::B::', arg-desc CP#4
 }
@@ -286,6 +486,54 @@
 Bytecode {
   Entry                0
   CheckStack
+  PushConstant         CP#0
+  PushConstant         CP#2
+  IndirectStaticCall   1, CP#1
+  Drop1
+  PushConstant         CP#3
+  ReturnTOS
+}
+ConstantPool {
+  [0] = TypeArgs [dart.core::int, dart.core::List<dart.core::String>]
+  [1] = ArgDesc num-args 1, num-type-args 0, names []
+  [2] = StaticICData target '#lib::G::test_factory', arg-desc CP#1
+  [3] = Null
+}
+]static method foo4() → void {
+  self::G::test_factory<core::int, core::List<core::String>>();
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  PushConstant         CP#2
+  IndirectStaticCall   1, CP#1
+  Drop1
+  PushConstant         CP#0
+  PushConstant         CP#3
+  PushConstant         CP#5
+  IndirectStaticCall   2, CP#4
+  Drop1
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+  [1] = ArgDesc num-args 1, num-type-args 0, names []
+  [2] = StaticICData target '#lib::I::test_factory2', arg-desc CP#1
+  [3] = Int 42
+  [4] = ArgDesc num-args 2, num-type-args 0, names [param]
+  [5] = StaticICData target '#lib::I::test_factory2', arg-desc CP#4
+}
+]static method foo5() → void {
+  self::I::test_factory2();
+  self::I::test_factory2(param: 42);
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
   PushConstant         CP#1
   IndirectStaticCall   0, CP#0
   Drop1
diff --git a/pkg/vm/testcases/bytecode/literals.dart.expect b/pkg/vm/testcases/bytecode/literals.dart.expect
index 1d49cf2..c248ce0 100644
--- a/pkg/vm/testcases/bytecode/literals.dart.expect
+++ b/pkg/vm/testcases/bytecode/literals.dart.expect
@@ -551,16 +551,16 @@
   PushConstant         CP#15
   IndirectStaticCall   1, CP#9
   Drop1
-  PushConstant         CP#17
+  PushConstant         CP#16
   Push                 FP[-8]
-  InstantiateTypeArgumentsTOS 1, CP#16
+  InstantiateTypeArgumentsTOS 1, CP#17
   PushConstant         CP#18
   PushConstant         CP#19
   IndirectStaticCall   2, CP#7
   PushConstant         CP#20
   IndirectStaticCall   1, CP#9
   Drop1
-  PushConstant         CP#17
+  PushConstant         CP#16
   Push                 FP[-8]
   InstantiateTypeArgumentsTOS 1, CP#21
   PushConstant         CP#1
@@ -580,7 +580,7 @@
   PushConstant         CP#23
   IndirectStaticCall   1, CP#9
   Drop1
-  PushConstant         CP#17
+  PushConstant         CP#16
   ReturnTOS
 }
 ConstantPool {
@@ -600,8 +600,8 @@
   [13] = ICData target-name 'toString', arg-desc CP#9
   [14] = StaticICData target 'dart.core::Map::_fromLiteral', arg-desc CP#7
   [15] = StaticICData target 'dart.core::print', arg-desc CP#9
-  [16] = TypeArgs [dart.core::String, #lib::test_map_literal::T]
-  [17] = Null
+  [16] = Null
+  [17] = TypeArgs [dart.core::String, #lib::test_map_literal::T]
   [18] = List type-arg dynamic, entries CP# []
   [19] = StaticICData target 'dart.core::Map::_fromLiteral', arg-desc CP#7
   [20] = StaticICData target 'dart.core::print', arg-desc CP#9
diff --git a/pkg/vm/testcases/bytecode/type_ops.dart.expect b/pkg/vm/testcases/bytecode/type_ops.dart.expect
index fe9a2d4..16f4aaf 100644
--- a/pkg/vm/testcases/bytecode/type_ops.dart.expect
+++ b/pkg/vm/testcases/bytecode/type_ops.dart.expect
@@ -159,8 +159,7 @@
   Entry                0
   CheckStack
   Push                 FP[-5]
-  Push                 FP[-6]
-  LoadFieldTOS         CP#0
+  PushConstant         CP#0
   Push                 FP[-7]
   PushConstant         CP#1
   InstanceCall1        4, CP#3
@@ -174,31 +173,31 @@
 L1:
   Push                 FP[-5]
   Push                 FP[-6]
-  LoadFieldTOS         CP#0
+  LoadFieldTOS         CP#8
   Push                 FP[-7]
-  PushConstant         CP#8
-  InstanceCall1        4, CP#9
+  PushConstant         CP#9
+  InstanceCall1        4, CP#10
   PushConstant         CP#4
   IfNeStrictTOS
   Jump                 L2
-  PushConstant         CP#10
   PushConstant         CP#11
+  PushConstant         CP#12
   IndirectStaticCall   1, CP#6
   Drop1
 L2:
   Push                 FP[-5]
   Push                 FP[-6]
-  LoadFieldTOS         CP#0
+  LoadFieldTOS         CP#8
   Push                 FP[-7]
-  PushConstant         CP#12
-  InstanceCall1        4, CP#13
-  InstanceCall1        1, CP#14
+  PushConstant         CP#13
+  InstanceCall1        4, CP#14
+  InstanceCall1        1, CP#15
   ReturnTOS
-  PushConstant         CP#15
+  PushConstant         CP#0
   ReturnTOS
 }
 ConstantPool {
-  [0] = TypeArgumentsFieldOffset #lib::D
+  [0] = Null
   [1] = Type #lib::A<#lib::D::foo3::T1>
   [2] = ArgDesc num-args 4, num-type-args 0, names []
   [3] = ICData target-name 'dart.core::_instanceOf', arg-desc CP#2
@@ -206,14 +205,14 @@
   [5] = String '31'
   [6] = ArgDesc num-args 1, num-type-args 0, names []
   [7] = StaticICData target 'dart.core::print', arg-desc CP#6
-  [8] = Type #lib::C<dart.core::Map<#lib::D::foo3::T1, #lib::D::P>, dart.core::List<#lib::D::foo3::T2>, #lib::D::Q>
-  [9] = ICData target-name 'dart.core::_instanceOf', arg-desc CP#2
-  [10] = String '32'
-  [11] = StaticICData target 'dart.core::print', arg-desc CP#6
-  [12] = Type dart.core::Map<#lib::D::foo3::T2, #lib::D::Q>
-  [13] = ICData target-name 'dart.core::_as', arg-desc CP#2
-  [14] = ICData get target-name 'values', arg-desc CP#6
-  [15] = Null
+  [8] = TypeArgumentsFieldOffset #lib::D
+  [9] = Type #lib::C<dart.core::Map<#lib::D::foo3::T1, #lib::D::P>, dart.core::List<#lib::D::foo3::T2>, #lib::D::Q>
+  [10] = ICData target-name 'dart.core::_instanceOf', arg-desc CP#2
+  [11] = String '32'
+  [12] = StaticICData target 'dart.core::print', arg-desc CP#6
+  [13] = Type dart.core::Map<#lib::D::foo3::T2, #lib::D::Q>
+  [14] = ICData target-name 'dart.core::_as', arg-desc CP#2
+  [15] = ICData get target-name 'values', arg-desc CP#6
 }
 ]  method foo3<T1 extends core::Object = dynamic, T2 extends core::Object = dynamic>(dynamic z) → dynamic {
     if(z is self::A<self::D::foo3::T1>) {
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 34dfa36..925603f 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect
@@ -37,7 +37,7 @@
 }
 static method foo([@vm.inferred-type.metadata=dart.core::Null?] (core::List<core::int>) → void a) → core::int {
   @self::VarAnnotation::•() core::int x = 2;
-  return x.{core::num::+}(2);
+  return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] x.{core::num::+}(2);
 }
 @self::ParametrizedAnnotation::•<core::Null>(null)
 static method main(core::List<core::String> args) → dynamic {
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 49b8a68..86cc1b1 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
@@ -11,13 +11,10 @@
     : 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::•()
     ;
   operator [](core::int i) → core::double
-    return [@vm.direct-call.metadata=dart.typed_data::_Float64List::[]] [@vm.inferred-type.metadata=dart.core::_Double] [@vm.direct-call.metadata=#lib::_Vector::_elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements}.{core::List::[]}(i.{core::num::+}([@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=!] this.{self::_Vector::_offset}));
-  operator []=([@vm.inferred-type.metadata=!] 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=!] this.{self::_Vector::_offset} in throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
-  }
+    return [@vm.direct-call.metadata=dart.typed_data::_Float64List::[]] [@vm.inferred-type.metadata=dart.core::_Double] [@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::+??] i.{core::num::+}([@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=!] this.{self::_Vector::_offset}));
   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?] i.{core::num::<}([@vm.direct-call.metadata=#lib::_Vector::_length] [@vm.inferred-type.metadata=!] this.{self::_Vector::_length}); i = i.{core::num::+}(1))
+    for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool] i.{core::num::<}([@vm.direct-call.metadata=#lib::_Vector::_length] [@vm.inferred-type.metadata=!] this.{self::_Vector::_length}); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] i.{core::num::+}(1))
       result = [@vm.direct-call.metadata=dart.core::_Double::+??] [@vm.inferred-type.metadata=dart.core::_Double] result.{core::double::+}([@vm.direct-call.metadata=dart.core::_Double::*] [@vm.inferred-type.metadata=dart.core::_Double] [@vm.direct-call.metadata=#lib::_Vector::[]] [@vm.inferred-type.metadata=dart.core::_Double] this.{self::_Vector::[]}(i).{core::double::*}([@vm.direct-call.metadata=#lib::_Vector::[]??] [@vm.inferred-type.metadata=dart.core::_Double] a.{self::_Vector::[]}(i)));
     return result;
   }
@@ -25,8 +22,8 @@
 [@vm.inferred-type.metadata=#lib::_Vector?]static field self::_Vector v = new self::_Vector::•(10);
 [@vm.inferred-type.metadata=dart.core::_Double?]static field core::double x = 0.0;
 static method main(core::List<core::String> args) → dynamic {
-  core::Stopwatch timer = let final core::Stopwatch #t4 = new core::Stopwatch::•() in let final dynamic #t5 = [@vm.direct-call.metadata=dart.core::Stopwatch::start] #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?] i.{core::num::<}(100000000); i = i.{core::num::+}(1)) {
+  core::Stopwatch timer = let final core::Stopwatch #t1 = new core::Stopwatch::•() in let final dynamic #t2 = [@vm.direct-call.metadata=dart.core::Stopwatch::start] #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] i.{core::num::<}(100000000); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] i.{core::num::+}(1)) {
     self::x = [@vm.direct-call.metadata=dart.core::_Double::+??] [@vm.inferred-type.metadata=dart.core::_Double] [@vm.inferred-type.metadata=dart.core::_Double?] self::x.{core::double::+}([@vm.direct-call.metadata=#lib::_Vector::*??] [@vm.inferred-type.metadata=dart.core::_Double] [@vm.inferred-type.metadata=#lib::_Vector?] self::v.{self::_Vector::*}([@vm.inferred-type.metadata=#lib::_Vector?] self::v));
   }
   [@vm.direct-call.metadata=dart.core::Stopwatch::stop] timer.{core::Stopwatch::stop}();
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 3bbe8aa..002fca8 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
@@ -12,7 +12,7 @@
     : super self::A::•()
     ;
   method foo() → core::int
-    return 1.{core::num::+}([@vm.inferred-type.metadata=#lib::B] self::knownResult().foo() as{TypeError} core::num) as{TypeError} core::int;
+    return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] 1.{core::num::+}([@vm.inferred-type.metadata=#lib::B] self::knownResult().foo() as{TypeError} core::num) as{TypeError} core::int;
 }
 class TearOffDynamicMethod extends core::Object {
   field dynamic bazz;
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 fb289be..00d3f0f 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
@@ -13,7 +13,7 @@
     : super self::A::•()
     ;
   method foo() → core::int
-    return 1.{core::num::+}([@vm.inferred-type.metadata=#lib::B] self::knownResult().foo() as{TypeError} core::num) as{TypeError} core::int;
+    return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] 1.{core::num::+}([@vm.inferred-type.metadata=#lib::B] self::knownResult().foo() as{TypeError} core::num) as{TypeError} core::int;
 }
 class TearOffInterfaceMethod extends core::Object {
   field dynamic bazz;
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 2bb45cc..72d0517 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
@@ -13,14 +13,14 @@
     : super self::A::•()
     ;
   method foo() → core::int
-    return 1.{core::num::+}([@vm.inferred-type.metadata=#lib::B] self::knownResult().foo() as{TypeError} core::num) as{TypeError} core::int;
+    return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] 1.{core::num::+}([@vm.inferred-type.metadata=#lib::B] self::knownResult().foo() as{TypeError} core::num) as{TypeError} core::int;
 }
 abstract class Base extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method foo() → core::int
-    return 3.{core::num::+}([@vm.inferred-type.metadata=#lib::B] self::knownResult().foo() as{TypeError} core::num) as{TypeError} core::int;
+    return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] 3.{core::num::+}([@vm.inferred-type.metadata=#lib::B] self::knownResult().foo() as{TypeError} core::num) as{TypeError} core::int;
   method doCall(dynamic x) → core::int
     return x.call() as{TypeError} core::int;
 }
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index df3d515..e7c7886 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -856,131 +856,6 @@
   return cobject;
 }
 
-static bool IsHexDigit(char c) {
-  return (('0' <= c) && (c <= '9')) || (('A' <= c) && (c <= 'F')) ||
-         (('a' <= c) && (c <= 'f'));
-}
-
-static int HexDigitToInt(char c) {
-  if (('0' <= c) && (c <= '9')) return c - '0';
-  if (('A' <= c) && (c <= 'F')) return 10 + (c - 'A');
-  return 10 + (c - 'a');
-}
-
-Dart_CObject* CObject::NewBigint(const char* hex_value) {
-  if (hex_value == NULL) {
-    return NULL;
-  }
-  bool neg = false;
-  if (hex_value[0] == '-') {
-    neg = true;
-    hex_value++;
-  }
-  if ((hex_value[0] != '0') ||
-      ((hex_value[1] != 'x') && (hex_value[1] != 'X'))) {
-    return NULL;
-  }
-  hex_value += 2;
-  intptr_t hex_i = strlen(hex_value);  // Terminating byte excluded.
-  if (hex_i == 0) {
-    return NULL;
-  }
-  const int kBitsPerHexDigit = 4;
-  const int kHexDigitsPerDigit = 8;
-  const int kBitsPerDigit = kBitsPerHexDigit * kHexDigitsPerDigit;
-  const intptr_t len = (hex_i + kHexDigitsPerDigit - 1) / kHexDigitsPerDigit;
-  Dart_CObject* cobject = New(Dart_CObject_kBigint);
-  cobject->value.as_bigint.digits = NewUint32Array(len);
-  uint32_t* digits = reinterpret_cast<uint32_t*>(
-      cobject->value.as_bigint.digits->value.as_typed_data.values);
-  intptr_t used = 0;
-  uint32_t digit = 0;
-  intptr_t bit_i = 0;
-  while (--hex_i >= 0) {
-    if (!IsHexDigit(hex_value[hex_i])) {
-      return NULL;
-    }
-    digit += HexDigitToInt(hex_value[hex_i]) << bit_i;
-    bit_i += kBitsPerHexDigit;
-    if (bit_i == kBitsPerDigit) {
-      bit_i = 0;
-      digits[used++] = digit;
-      digit = 0;
-    }
-  }
-  if (bit_i != 0) {
-    digits[used++] = digit;
-  }
-  while ((used > 0) && (digits[used - 1] == 0)) {
-    used--;
-  }
-  cobject->value.as_bigint.used = used;
-  if (used == 0) {
-    neg = false;
-  }
-  cobject->value.as_bigint.neg = neg;
-  return cobject;
-}
-
-static char IntToHexDigit(int i) {
-  ASSERT(0 <= i && i < 16);
-  if (i < 10) return static_cast<char>('0' + i);
-  return static_cast<char>('A' + (i - 10));
-}
-
-char* CObject::BigintToHexValue(Dart_CObject* bigint) {
-  ASSERT(bigint->type == Dart_CObject_kBigint);
-  const intptr_t used = bigint->value.as_bigint.used;
-  if (used == 0) {
-    const char* zero = "0x0";
-    const size_t len = strlen(zero) + 1;
-    char* hex_value = reinterpret_cast<char*>(malloc(len));
-    strncpy(hex_value, zero, len);
-    return hex_value;
-  }
-  const int kBitsPerHexDigit = 4;
-  const int kHexDigitsPerDigit = 8;
-  const intptr_t kMaxUsed = (kIntptrMax - 4) / kHexDigitsPerDigit;
-  if (used > kMaxUsed) {
-    return NULL;
-  }
-  intptr_t hex_len = (used - 1) * kHexDigitsPerDigit;
-  const uint32_t* digits = reinterpret_cast<uint32_t*>(
-      bigint->value.as_bigint.digits->value.as_typed_data.values);
-  // The most significant digit may use fewer than kHexDigitsPerDigit digits.
-  uint32_t digit = digits[used - 1];
-  ASSERT(digit != 0);  // Value must be clamped.
-  while (digit != 0) {
-    hex_len++;
-    digit >>= kBitsPerHexDigit;
-  }
-  const bool neg = bigint->value.as_bigint.neg;
-  // Add bytes for '0x', for the minus sign, and for the trailing \0 character.
-  const int32_t len = (neg ? 1 : 0) + 2 + hex_len + 1;
-  char* hex_value = reinterpret_cast<char*>(malloc(len));
-  intptr_t pos = len;
-  hex_value[--pos] = '\0';
-  for (intptr_t i = 0; i < (used - 1); i++) {
-    digit = digits[i];
-    for (intptr_t j = 0; j < kHexDigitsPerDigit; j++) {
-      hex_value[--pos] = IntToHexDigit(digit & 0xf);
-      digit >>= kBitsPerHexDigit;
-    }
-  }
-  digit = digits[used - 1];
-  while (digit != 0) {
-    hex_value[--pos] = IntToHexDigit(digit & 0xf);
-    digit >>= kBitsPerHexDigit;
-  }
-  hex_value[--pos] = 'x';
-  hex_value[--pos] = '0';
-  if (neg) {
-    hex_value[--pos] = '-';
-  }
-  ASSERT(pos == 0);
-  return hex_value;
-}
-
 Dart_CObject* CObject::NewDouble(double value) {
   Dart_CObject* cobject = New(Dart_CObject_kDouble);
   cobject->value.as_double = value;
diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h
index 7c4a735..661ec7f 100644
--- a/runtime/bin/dartutils.h
+++ b/runtime/bin/dartutils.h
@@ -298,7 +298,6 @@
   bool IsInt64() { return type() == Dart_CObject_kInt64; }
   bool IsInt32OrInt64() { return IsInt32() || IsInt64(); }
   bool IsIntptr() { return IsInt32OrInt64(); }
-  bool IsBigint() { return type() == Dart_CObject_kBigint; }
   bool IsDouble() { return type() == Dart_CObject_kDouble; }
   bool IsString() { return type() == Dart_CObject_kString; }
   bool IsArray() { return type() == Dart_CObject_kArray; }
@@ -326,8 +325,6 @@
   static Dart_CObject* NewInt32(int32_t value);
   static Dart_CObject* NewInt64(int64_t value);
   static Dart_CObject* NewIntptr(intptr_t value);
-  static Dart_CObject* NewBigint(const char* hex_value);
-  static char* BigintToHexValue(Dart_CObject* bigint);
   static Dart_CObject* NewDouble(double value);
   static Dart_CObject* NewString(intptr_t length);
   static Dart_CObject* NewString(const char* str);
@@ -468,36 +465,6 @@
   DISALLOW_COPY_AND_ASSIGN(CObjectIntptr);
 };
 
-class CObjectBigint : public CObject {
- public:
-  // DECLARE_COBJECT_CONSTRUCTORS(Bigint) would miss hex_value_ initialization.
-  explicit CObjectBigint(Dart_CObject* cobject) : CObject(cobject) {
-    ASSERT(type() == Dart_CObject_kBigint);
-    cobject_ = cobject;
-    hex_value_ = NULL;
-  }
-  explicit CObjectBigint(CObject* cobject) : CObject() {
-    ASSERT(cobject != NULL);
-    ASSERT(cobject->type() == Dart_CObject_kBigint);
-    cobject_ = cobject->AsApiCObject();
-    hex_value_ = NULL;
-  }
-
-  char* Value() {
-    if (hex_value_ == NULL) {
-      hex_value_ = BigintToHexValue(cobject_);
-    }
-    ASSERT(hex_value_ != NULL);
-    return hex_value_;
-  }
-
-  ~CObjectBigint() { free(hex_value_); }
-
- private:
-  char* hex_value_;
-  DISALLOW_COPY_AND_ASSIGN(CObjectBigint);
-};
-
 class CObjectDouble : public CObject {
  public:
   DECLARE_COBJECT_CONSTRUCTORS(Double)
diff --git a/runtime/bin/directory_fuchsia.cc b/runtime/bin/directory_fuchsia.cc
index 858ccac..999a6d4 100644
--- a/runtime/bin/directory_fuchsia.cc
+++ b/runtime/bin/directory_fuchsia.cc
@@ -10,7 +10,7 @@
 #include <dirent.h>          // NOLINT
 #include <errno.h>           // NOLINT
 #include <fcntl.h>           // NOLINT
-#include <fdio/namespace.h>  // NOLINT
+#include <lib/fdio/namespace.h>  // NOLINT
 #include <stdlib.h>          // NOLINT
 #include <string.h>          // NOLINT
 #include <sys/param.h>       // NOLINT
diff --git a/runtime/bin/eventhandler_fuchsia.cc b/runtime/bin/eventhandler_fuchsia.cc
index 16eee9d..b2dd6e2 100644
--- a/runtime/bin/eventhandler_fuchsia.cc
+++ b/runtime/bin/eventhandler_fuchsia.cc
@@ -10,7 +10,7 @@
 
 #include <errno.h>
 #include <fcntl.h>
-#include <fdio/private.h>
+#include <lib/fdio/private.h>
 #include <poll.h>
 #include <pthread.h>
 #include <stdio.h>
diff --git a/runtime/bin/eventhandler_fuchsia.h b/runtime/bin/eventhandler_fuchsia.h
index 50f4520..170f7bd 100644
--- a/runtime/bin/eventhandler_fuchsia.h
+++ b/runtime/bin/eventhandler_fuchsia.h
@@ -10,7 +10,7 @@
 #endif
 
 #include <errno.h>
-#include <fdio/private.h>
+#include <lib/fdio/private.h>
 #include <sys/socket.h>
 #include <unistd.h>
 #include <zircon/status.h>
diff --git a/runtime/bin/extensions_fuchsia.cc b/runtime/bin/extensions_fuchsia.cc
index 34aa8d0..db447a3 100644
--- a/runtime/bin/extensions_fuchsia.cc
+++ b/runtime/bin/extensions_fuchsia.cc
@@ -9,7 +9,7 @@
 
 #include <dlfcn.h>
 #include <fcntl.h>
-#include <fdio/io.h>
+#include <lib/fdio/io.h>
 #include <launchpad/vmo.h>
 #include <zircon/dlfcn.h>
 
diff --git a/runtime/bin/file_fuchsia.cc b/runtime/bin/file_fuchsia.cc
index dbec7d8..5d3dffb 100644
--- a/runtime/bin/file_fuchsia.cc
+++ b/runtime/bin/file_fuchsia.cc
@@ -9,7 +9,7 @@
 
 #include <errno.h>           // NOLINT
 #include <fcntl.h>           // NOLINT
-#include <fdio/namespace.h>  // NOLINT
+#include <lib/fdio/namespace.h>  // NOLINT
 #include <libgen.h>          // NOLINT
 #include <sys/mman.h>        // NOLINT
 #include <sys/stat.h>        // NOLINT
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 7b8346b..59b994e 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -88,6 +88,8 @@
 
 static Dart_Isolate main_isolate = NULL;
 
+static void ReadFile(const char* filename, uint8_t** buffer, intptr_t* size);
+
 static Dart_Handle CreateRuntimeOptions(CommandLineOptions* options) {
   int options_count = options->count();
   Dart_Handle dart_arguments =
@@ -213,6 +215,54 @@
   }
 }
 
+static Dart_Isolate IsolateSetupHelperAotCompilationDart2(
+    const char* script_uri,
+    const char* main,
+    const char* package_root,
+    const char* packages_config,
+    Dart_IsolateFlags* flags,
+    char** error,
+    int* exit_code) {
+  uint8_t* payload = NULL;
+  intptr_t payload_length = -1;
+  if (File::GetType(NULL, script_uri, true) == File::kIsFile) {
+    ReadFile(script_uri, &payload, &payload_length);
+  }
+  if (payload == NULL ||
+      DartUtils::SniffForMagicNumber(payload, payload_length) !=
+          DartUtils::kKernelMagicNumber) {
+    FATAL1(
+        "Dart 2.0 AOT compilations only accept Kernel IR files as "
+        "input ('%s' is not a valid Kernel IR file).\n",
+        script_uri);
+  }
+
+  auto isolate_data = new IsolateData(script_uri, NULL, NULL, NULL);
+
+  // We bootstrap the isolate from the Kernel file (instead of using a
+  // potentially linked-in kernel file).
+  Dart_Isolate isolate = Dart_CreateIsolateFromKernel(
+      script_uri, main, payload, payload_length, flags, isolate_data, error);
+  if (isolate == NULL) {
+    free(payload);
+    return NULL;
+  }
+
+  Dart_EnterScope();
+  Dart_Handle library = Dart_LoadScriptFromKernel(payload, payload_length);
+  free(payload);
+  CHECK_RESULT(library);
+  Dart_Handle url = DartUtils::NewString("dart:_builtin");
+  CHECK_RESULT(url);
+  Dart_Handle builtin_lib = Dart_LookupLibrary(url);
+  CHECK_RESULT(builtin_lib);
+  isolate_data->set_builtin_lib(builtin_lib);
+  Dart_ExitScope();
+  Dart_ExitIsolate();
+
+  return isolate;
+}
+
 static Dart_Isolate IsolateSetupHelper(Dart_Isolate isolate,
                                        bool is_main_isolate,
                                        const char* script_uri,
@@ -655,6 +705,7 @@
 #else
     bool set_native_resolvers = isolate_snapshot_data != NULL;
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
+
     created_isolate =
         IsolateSetupHelper(isolate, is_main_isolate, script_uri, package_root,
                            packages_config, set_native_resolvers,
@@ -888,9 +939,17 @@
     flags.entry_points = standalone_entry_points;
   }
 
-  Dart_Isolate isolate = CreateIsolateAndSetupHelper(
-      is_main_isolate, script_name, "main", Options::package_root(),
-      Options::packages_file(), &flags, &error, &exit_code);
+  Dart_Isolate isolate = NULL;
+  if (flags.strong && Options::gen_snapshot_kind() == kAppAOT) {
+    isolate = IsolateSetupHelperAotCompilationDart2(
+        script_name, "main", Options::package_root(), Options::packages_file(),
+        &flags, &error, &exit_code);
+  } else {
+    isolate = CreateIsolateAndSetupHelper(
+        is_main_isolate, script_name, "main", Options::package_root(),
+        Options::packages_file(), &flags, &error, &exit_code);
+  }
+
   if (isolate == NULL) {
     delete[] isolate_name;
     Log::PrintErr("%s\n", error);
diff --git a/runtime/bin/namespace_fuchsia.cc b/runtime/bin/namespace_fuchsia.cc
index b84ccb4..ff8ea79 100644
--- a/runtime/bin/namespace_fuchsia.cc
+++ b/runtime/bin/namespace_fuchsia.cc
@@ -9,8 +9,8 @@
 
 #include <errno.h>
 #include <fcntl.h>
-#include <fdio/namespace.h>
-#include <fdio/private.h>
+#include <lib/fdio/namespace.h>
+#include <lib/fdio/private.h>
 #include <zircon/status.h>
 
 #include "bin/file.h"
diff --git a/runtime/bin/process_fuchsia.cc b/runtime/bin/process_fuchsia.cc
index d8ff3d0..fb52be3 100644
--- a/runtime/bin/process_fuchsia.cc
+++ b/runtime/bin/process_fuchsia.cc
@@ -9,10 +9,10 @@
 
 #include <errno.h>
 #include <fcntl.h>
-#include <fdio/io.h>
-#include <fdio/namespace.h>
-#include <fdio/private.h>
-#include <fdio/util.h>
+#include <lib/fdio/io.h>
+#include <lib/fdio/namespace.h>
+#include <lib/fdio/private.h>
+#include <lib/fdio/util.h>
 #include <launchpad/launchpad.h>
 #include <launchpad/vmo.h>
 #include <poll.h>
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index c52f569..b5bdd1a 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -261,7 +261,6 @@
     void* isolate_callback_data,
     Dart_WeakPersistentHandle handle,
     void* peer);
-typedef void (*Dart_PeerFinalizer)(void* peer);
 
 /**
  * Is this an error handle?
@@ -1760,7 +1759,9 @@
  * \param latin1_array Array of Latin-1 encoded characters. This must not move.
  * \param length The length of the characters array.
  * \param peer An external pointer to associate with this string.
- * \param cback A callback to be called when this string is finalized.
+ * \param external_allocation_size The number of externally allocated
+ *   bytes for peer. Used to inform the garbage collector.
+ * \param callback A callback to be called when this string is finalized.
  *
  * \return The String object if no error occurs. Otherwise returns
  *   an error handle.
@@ -1769,7 +1770,8 @@
 Dart_NewExternalLatin1String(const uint8_t* latin1_array,
                              intptr_t length,
                              void* peer,
-                             Dart_PeerFinalizer cback);
+                             intptr_t external_allocation_size,
+                             Dart_WeakPersistentHandleFinalizer callback);
 
 /**
  * Returns a String which references an external array of UTF-16 encoded
@@ -1778,15 +1780,19 @@
  * \param utf16_array An array of UTF-16 encoded characters. This must not move.
  * \param length The length of the characters array.
  * \param peer An external pointer to associate with this string.
- * \param cback A callback to be called when this string is finalized.
+ * \param external_allocation_size The number of externally allocated
+ *   bytes for peer. Used to inform the garbage collector.
+ * \param callback A callback to be called when this string is finalized.
  *
  * \return The String object if no error occurs. Otherwise returns
  *   an error handle.
  */
-DART_EXPORT Dart_Handle Dart_NewExternalUTF16String(const uint16_t* utf16_array,
-                                                    intptr_t length,
-                                                    void* peer,
-                                                    Dart_PeerFinalizer cback);
+DART_EXPORT Dart_Handle
+Dart_NewExternalUTF16String(const uint16_t* utf16_array,
+                            intptr_t length,
+                            void* peer,
+                            intptr_t external_allocation_size,
+                            Dart_WeakPersistentHandleFinalizer callback);
 
 /**
  * Gets the C string representation of a String.
diff --git a/runtime/include/dart_native_api.h b/runtime/include/dart_native_api.h
index 934ef3d..eea02fd 100644
--- a/runtime/include/dart_native_api.h
+++ b/runtime/include/dart_native_api.h
@@ -7,7 +7,7 @@
 #ifndef RUNTIME_INCLUDE_DART_NATIVE_API_H_
 #define RUNTIME_INCLUDE_DART_NATIVE_API_H_
 
-#include "dart_api.h"
+#include "dart_api.h" /* NOLINT */
 
 /*
  * ==========================================
@@ -33,7 +33,6 @@
   Dart_CObject_kBool,
   Dart_CObject_kInt32,
   Dart_CObject_kInt64,
-  Dart_CObject_kBigint,
   Dart_CObject_kDouble,
   Dart_CObject_kString,
   Dart_CObject_kArray,
@@ -54,11 +53,6 @@
     double as_double;
     char* as_string;
     struct {
-      bool neg;
-      intptr_t used;
-      struct _Dart_CObject* digits;
-    } as_bigint;
-    struct {
       Dart_Port id;
       Dart_Port origin_id;
     } as_send_port;
diff --git a/runtime/lib/bigint.dart b/runtime/lib/bigint.dart
deleted file mode 100644
index b6a9db3..0000000
--- a/runtime/lib/bigint.dart
+++ /dev/null
@@ -1,2134 +0,0 @@
-// 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.
-
-// part of "core_patch.dart";
-
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
- * Copyright (c) 2003-2005  Tom Wu
- * Copyright (c) 2012 Adam Singer (adam@solvr.io)
- * 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" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF
- * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT
- * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * In addition, the following condition applies:
- *
- * All redistributions must retain an intact copy of this copyright notice
- * and disclaimer.
- */
-
-// A big integer number is represented by a sign, an array of 32-bit unsigned
-// integers in little endian format, and a number of used digits in that array.
-// The code makes sure that an even number of digits is always accessible and
-// meaningful, so that pairs of digits can be processed as 64-bit unsigned
-// numbers on a 64-bit platform. This requires the initialization of a leading
-// zero if the number of used digits is odd.
-class _Bigint extends _IntegerImplementation {
-  // Bits per digit.
-  static const int _DIGIT_BITS = 32;
-  static const int _LOG2_DIGIT_BITS = 5;
-  static const int _DIGIT_BASE = 1 << _DIGIT_BITS;
-  static const int _DIGIT_MASK = (1 << _DIGIT_BITS) - 1;
-
-  // Bits per half digit.
-  static const int _DIGIT2_BITS = _DIGIT_BITS >> 1;
-  static const int _DIGIT2_MASK = (1 << _DIGIT2_BITS) - 1;
-
-  // Bits per 2 digits. Used to perform modulo 2^64 arithmetic.
-  // Note: in --limit-ints-to-64-bits mode most arithmetic operations are
-  // already modulo 2^64. Still, it is harmless to apply _TWO_DIGITS_MASK:
-  // (1 << _TWO_DIGITS_BITS) is 0 (all bits are shifted out), so
-  // _TWO_DIGITS_MASK is -1 (its bit pattern is 0xffffffffffffffff).
-  static const int _TWO_DIGITS_BITS = _DIGIT_BITS << 1;
-  static const int _TWO_DIGITS_MASK = (1 << _TWO_DIGITS_BITS) - 1;
-
-  // Min and max of non bigint values.
-  static const int _MIN_INT64 = (-1) << 63;
-  static const int _MAX_INT64 = 0x7fffffffffffffff;
-
-  // Bigint constant values.
-  // Note: Not declared as final in order to satisfy optimizer, which expects
-  // constants to be in canonical form (Smi).
-  static _Bigint _MINUS_ONE = new _Bigint._fromInt(-1);
-  static _Bigint _ZERO = new _Bigint._fromInt(0);
-  static _Bigint _ONE = new _Bigint._fromInt(1);
-
-  // Result cache for last _divRem call.
-  static Uint32List _lastDividend_digits;
-  static int _lastDividend_used;
-  static Uint32List _lastDivisor_digits;
-  static int _lastDivisor_used;
-  static Uint32List _lastQuoRem_digits;
-  static int _lastQuoRem_used;
-  static int _lastRem_used;
-  static int _lastRem_nsh;
-
-  // Internal data structure.
-  bool get _neg native "Bigint_getNeg";
-  int get _used native "Bigint_getUsed";
-  Uint32List get _digits native "Bigint_getDigits";
-
-  // Factory returning an instance initialized with the given field values.
-  // The 'digits' array is first clamped and 'used' is reduced accordingly.
-  // A leading zero digit may be initialized to guarantee that digit pairs can
-  // be processed as 64-bit values on 64-bit platforms.
-  factory _Bigint(bool neg, int used, Uint32List digits)
-      native "Bigint_allocate";
-
-  // Factory returning an instance initialized to an integer value no larger
-  // than a Mint.
-  factory _Bigint._fromInt(int i) {
-    assert(i is! _Bigint);
-    var neg;
-    var l, h;
-    if (i < 0) {
-      neg = true;
-      if (i == _MIN_INT64) {
-        l = 0;
-        h = 0x80000000;
-      } else {
-        l = (-i) & _DIGIT_MASK;
-        h = (-i) >> _DIGIT_BITS;
-      }
-    } else {
-      neg = false;
-      l = i & _DIGIT_MASK;
-      h = i >> _DIGIT_BITS;
-    }
-    var digits = new Uint32List(2);
-    digits[0] = l;
-    digits[1] = h;
-    return new _Bigint(neg, 2, digits);
-  }
-
-  // Allocate an array of the given length (+1 for at least one leading zero
-  // digit if odd) and copy digits[from..to-1] starting at index 0, followed by
-  // leading zero digits.
-  static Uint32List _cloneDigits(
-      Uint32List digits, int from, int to, int length) {
-    length += length & 1; // Even number of digits.
-    var r_digits = new Uint32List(length);
-    var n = to - from;
-    for (var i = 0; i < n; i++) {
-      r_digits[i] = digits[from + i];
-    }
-    return r_digits;
-  }
-
-  // Return most compact integer (i.e. possibly Smi or Mint).
-  int _toValidInt() {
-    assert(_DIGIT_BITS == 32); // Otherwise this code needs to be revised.
-    var used = _used;
-    if (used == 0) return 0;
-    var digits = _digits;
-    if (used == 1) return _neg ? -digits[0] : digits[0];
-    if (used > 2) return this;
-    if (_neg) {
-      if (digits[1] > 0x80000000) return this;
-      if (digits[1] == 0x80000000) {
-        if (digits[0] > 0) return this;
-        return _MIN_INT64;
-      }
-      return -((digits[1] << _DIGIT_BITS) | digits[0]);
-    }
-    if (digits[1] >= 0x80000000) return this;
-    return (digits[1] << _DIGIT_BITS) | digits[0];
-  }
-
-  // Conversion from int to bigint.
-  _Bigint _toBigint() => this;
-
-  // Return -this.
-  _Bigint _negate() {
-    var used = _used;
-    if (used == 0) {
-      return this;
-    }
-    return new _Bigint(!_neg, used, _digits);
-  }
-
-  // Return abs(this).
-  _Bigint _abs() {
-    var neg = _neg;
-    if (!neg) {
-      return this;
-    }
-    return new _Bigint(!neg, _used, _digits);
-  }
-
-  // Return the bit length of digit x.
-  static int _nbits(int x) {
-    var r = 1, t;
-    if ((t = x >> 16) != 0) {
-      x = t;
-      r += 16;
-    }
-    if ((t = x >> 8) != 0) {
-      x = t;
-      r += 8;
-    }
-    if ((t = x >> 4) != 0) {
-      x = t;
-      r += 4;
-    }
-    if ((t = x >> 2) != 0) {
-      x = t;
-      r += 2;
-    }
-    if ((x >> 1) != 0) {
-      r += 1;
-    }
-    return r;
-  }
-
-  // Return this << n*_DIGIT_BITS.
-  _Bigint _dlShift(int n) {
-    final used = _used;
-    if (used == 0) {
-      return _ZERO;
-    }
-    final r_used = used + n;
-    final digits = _digits;
-    final r_digits = new Uint32List(r_used + (r_used & 1));
-    var i = used;
-    while (--i >= 0) {
-      r_digits[i + n] = digits[i];
-    }
-    return new _Bigint(_neg, r_used, r_digits);
-  }
-
-  // r_digits[0..r_used-1] = x_digits[0..x_used-1] << n*_DIGIT_BITS.
-  // Return r_used.
-  static int _dlShiftDigits(
-      Uint32List x_digits, int x_used, int n, Uint32List r_digits) {
-    if (x_used == 0) {
-      return 0;
-    }
-    if (n == 0 && identical(r_digits, x_digits)) {
-      return x_used;
-    }
-    final r_used = x_used + n;
-    assert(r_digits.length >= r_used + (r_used & 1));
-    var i = x_used;
-    while (--i >= 0) {
-      r_digits[i + n] = x_digits[i];
-    }
-    i = n;
-    while (--i >= 0) {
-      r_digits[i] = 0;
-    }
-    if (r_used.isOdd) {
-      r_digits[r_used] = 0;
-    }
-    return r_used;
-  }
-
-  // Return this >> n*_DIGIT_BITS.
-  _Bigint _drShift(int n) {
-    final used = _used;
-    if (used == 0) {
-      return _ZERO;
-    }
-    final r_used = used - n;
-    if (r_used <= 0) {
-      return _neg ? _MINUS_ONE : _ZERO;
-    }
-    final digits = _digits;
-    final r_digits = new Uint32List(r_used + (r_used & 1));
-    for (var i = n; i < used; i++) {
-      r_digits[i - n] = digits[i];
-    }
-    final r = new _Bigint(_neg, r_used, r_digits);
-    if (_neg) {
-      // Round down if any bit was shifted out.
-      for (var i = 0; i < n; i++) {
-        if (digits[i] != 0) {
-          return r._sub(_ONE);
-        }
-      }
-    }
-    return r;
-  }
-
-  // r_digits[0..r_used-1] = x_digits[0..x_used-1] >> n*_DIGIT_BITS.
-  // Return r_used.
-  static int _drShiftDigits(
-      Uint32List x_digits, int x_used, int n, Uint32List r_digits) {
-    final r_used = x_used - n;
-    if (r_used <= 0) {
-      return 0;
-    }
-    assert(r_digits.length >= r_used + (r_used & 1));
-    for (var i = n; i < x_used; i++) {
-      r_digits[i - n] = x_digits[i];
-    }
-    if (r_used.isOdd) {
-      r_digits[r_used] = 0;
-    }
-    return r_used;
-  }
-
-  // r_digits[ds..x_used+ds] = x_digits[0..x_used-1] << (n % _DIGIT_BITS)
-  // where ds = ceil(n / _DIGIT_BITS)
-  // Doesn't clear digits below ds.
-  static void _lsh(
-      Uint32List x_digits, int x_used, int n, Uint32List r_digits) {
-    final ds = n ~/ _DIGIT_BITS;
-    final bs = n % _DIGIT_BITS;
-    final cbs = _DIGIT_BITS - bs;
-    final bm = (1 << cbs) - 1;
-    var c = 0;
-    var i = x_used;
-    while (--i >= 0) {
-      final d = x_digits[i];
-      r_digits[i + ds + 1] = (d >> cbs) | c;
-      c = (d & bm) << bs;
-    }
-    r_digits[ds] = c;
-  }
-
-  // Return this << n.
-  _Bigint _lShift(int n) {
-    final ds = n ~/ _DIGIT_BITS;
-    final bs = n % _DIGIT_BITS;
-    if (bs == 0) {
-      return _dlShift(ds);
-    }
-    var r_used = _used + ds + 1;
-    var r_digits = new Uint32List(r_used + 2 - (r_used & 1)); // for 64-bit.
-    _lsh(_digits, _used, n, r_digits);
-    return new _Bigint(_neg, r_used, r_digits);
-  }
-
-  // r_digits[0..r_used-1] = x_digits[0..x_used-1] << n.
-  // Return r_used.
-  static int _lShiftDigits(
-      Uint32List x_digits, int x_used, int n, Uint32List r_digits) {
-    final ds = n ~/ _DIGIT_BITS;
-    final bs = n % _DIGIT_BITS;
-    if (bs == 0) {
-      return _dlShiftDigits(x_digits, x_used, ds, r_digits);
-    }
-    var r_used = x_used + ds + 1;
-    assert(r_digits.length >= r_used + 2 - (r_used & 1)); // for 64-bit.
-    _lsh(x_digits, x_used, n, r_digits);
-    var i = ds;
-    while (--i >= 0) {
-      r_digits[i] = 0;
-    }
-    if (r_digits[r_used - 1] == 0) {
-      r_used--; // Clamp result.
-    } else if (r_used.isOdd) {
-      r_digits[r_used] = 0;
-    }
-    return r_used;
-  }
-
-  // r_digits[0..r_used-1] = x_digits[0..x_used-1] >> n.
-  static void _rsh(
-      Uint32List x_digits, int x_used, int n, Uint32List r_digits) {
-    final ds = n ~/ _DIGIT_BITS;
-    final bs = n % _DIGIT_BITS;
-    final cbs = _DIGIT_BITS - bs;
-    final bm = (1 << bs) - 1;
-    var c = x_digits[ds] >> bs;
-    final last = x_used - ds - 1;
-    for (var i = 0; i < last; i++) {
-      final d = x_digits[i + ds + 1];
-      r_digits[i] = ((d & bm) << cbs) | c;
-      c = d >> bs;
-    }
-    r_digits[last] = c;
-  }
-
-  // Return this >> n.
-  _Bigint _rShift(int n) {
-    final ds = n ~/ _DIGIT_BITS;
-    final bs = n % _DIGIT_BITS;
-    if (bs == 0) {
-      return _drShift(ds);
-    }
-    final used = _used;
-    final r_used = used - ds;
-    if (r_used <= 0) {
-      return _neg ? _MINUS_ONE : _ZERO;
-    }
-    final digits = _digits;
-    final r_digits = new Uint32List(r_used + (r_used & 1));
-    _rsh(digits, used, n, r_digits);
-    final r = new _Bigint(_neg, r_used, r_digits);
-    if (_neg) {
-      // Round down if any bit was shifted out.
-      if ((digits[ds] & ((1 << bs) - 1)) != 0) {
-        return r._sub(_ONE);
-      }
-      for (var i = 0; i < ds; i++) {
-        if (digits[i] != 0) {
-          return r._sub(_ONE);
-        }
-      }
-    }
-    return r;
-  }
-
-  // r_digits[0..r_used-1] = x_digits[0..x_used-1] >> n.
-  // Return r_used.
-  static int _rShiftDigits(
-      Uint32List x_digits, int x_used, int n, Uint32List r_digits) {
-    final ds = n ~/ _DIGIT_BITS;
-    final bs = n % _DIGIT_BITS;
-    if (bs == 0) {
-      return _drShiftDigits(x_digits, x_used, ds, r_digits);
-    }
-    var r_used = x_used - ds;
-    if (r_used <= 0) {
-      return 0;
-    }
-    assert(r_digits.length >= r_used + (r_used & 1));
-    _rsh(x_digits, x_used, n, r_digits);
-    if (r_digits[r_used - 1] == 0) {
-      r_used--; // Clamp result.
-    } else if (r_used.isOdd) {
-      r_digits[r_used] = 0;
-    }
-    return r_used;
-  }
-
-  // Return 0 if abs(this) == abs(a).
-  // Return a positive number if abs(this) > abs(a).
-  // Return a negative number if abs(this) < abs(a).
-  int _absCompare(_Bigint a) {
-    var r = _used - a._used;
-    if (r == 0) {
-      var i = _used;
-      var digits = _digits;
-      var a_digits = a._digits;
-      while (--i >= 0 && (r = digits[i] - a_digits[i]) == 0);
-    }
-    return r;
-  }
-
-  // Return 0 if this == a.
-  // Return a positive number if this > a.
-  // Return a negative number if this < a.
-  int _compare(_Bigint a) {
-    if (_neg == a._neg) {
-      var r = _absCompare(a);
-      return _neg ? -r : r;
-    }
-    return _neg ? -1 : 1;
-  }
-
-  // Compare digits[0..used-1] with a_digits[0..a_used-1].
-  // Return 0 if equal.
-  // Return a positive number if larger.
-  // Return a negative number if smaller.
-  static int _compareDigits(
-      Uint32List digits, int used, Uint32List a_digits, int a_used) {
-    var r = used - a_used;
-    if (r == 0) {
-      var i = a_used;
-      while (--i >= 0 && (r = digits[i] - a_digits[i]) == 0);
-    }
-    return r;
-  }
-
-  // r_digits[0..used] = digits[0..used-1] + a_digits[0..a_used-1].
-  // used >= a_used > 0.
-  // Note: Intrinsics on 64-bit platforms process digit pairs at even indices.
-  static void _absAdd(Uint32List digits, int used, Uint32List a_digits,
-      int a_used, Uint32List r_digits) {
-    assert(used >= a_used && a_used > 0);
-    // Verify that digit pairs are accessible for 64-bit processing.
-    assert(digits.length > ((used - 1) | 1));
-    assert(a_digits.length > ((a_used - 1) | 1));
-    assert(r_digits.length > (used | 1));
-    var c = 0;
-    for (var i = 0; i < a_used; i++) {
-      c += digits[i] + a_digits[i];
-      r_digits[i] = c & _DIGIT_MASK;
-      c >>= _DIGIT_BITS;
-    }
-    for (var i = a_used; i < used; i++) {
-      c += digits[i];
-      r_digits[i] = c & _DIGIT_MASK;
-      c >>= _DIGIT_BITS;
-    }
-    r_digits[used] = c;
-  }
-
-  // r_digits[0..used-1] = digits[0..used-1] - a_digits[0..a_used-1].
-  // used >= a_used > 0.
-  // Note: Intrinsics on 64-bit platforms process digit pairs at even indices.
-  static void _absSub(Uint32List digits, int used, Uint32List a_digits,
-      int a_used, Uint32List r_digits) {
-    assert(used >= a_used && a_used > 0);
-    // Verify that digit pairs are accessible for 64-bit processing.
-    assert(digits.length > ((used - 1) | 1));
-    assert(a_digits.length > ((a_used - 1) | 1));
-    assert(r_digits.length > ((used - 1) | 1));
-    var c = 0;
-    for (var i = 0; i < a_used; i++) {
-      c += digits[i] - a_digits[i];
-      r_digits[i] = c & _DIGIT_MASK;
-      c >>= _DIGIT_BITS;
-    }
-    for (var i = a_used; i < used; i++) {
-      c += digits[i];
-      r_digits[i] = c & _DIGIT_MASK;
-      c >>= _DIGIT_BITS;
-    }
-  }
-
-  // Return abs(this) + abs(a) with sign set according to neg.
-  _Bigint _absAddSetSign(_Bigint a, bool neg) {
-    var used = _used;
-    var a_used = a._used;
-    if (used < a_used) {
-      return a._absAddSetSign(this, neg);
-    }
-    if (used == 0) {
-      assert(!neg);
-      return _ZERO;
-    }
-    if (a_used == 0) {
-      return _neg == neg ? this : this._negate();
-    }
-    var r_used = used + 1;
-    var r_digits = new Uint32List(r_used + (r_used & 1));
-    _absAdd(_digits, used, a._digits, a_used, r_digits);
-    return new _Bigint(neg, r_used, r_digits);
-  }
-
-  // Return abs(this) - abs(a) with sign set according to neg.
-  // Requirement: abs(this) >= abs(a).
-  _Bigint _absSubSetSign(_Bigint a, bool neg) {
-    assert(_absCompare(a) >= 0);
-    var used = _used;
-    if (used == 0) {
-      assert(!neg);
-      return _ZERO;
-    }
-    var a_used = a._used;
-    if (a_used == 0) {
-      return _neg == neg ? this : this._negate();
-    }
-    var r_digits = new Uint32List(used + (used & 1));
-    _absSub(_digits, used, a._digits, a_used, r_digits);
-    return new _Bigint(neg, used, r_digits);
-  }
-
-  // Return abs(this) & abs(a) with sign set according to neg.
-  _Bigint _absAndSetSign(_Bigint a, bool neg) {
-    var r_used = (_used < a._used) ? _used : a._used;
-    var digits = _digits;
-    var a_digits = a._digits;
-    var r_digits = new Uint32List(r_used + (r_used & 1));
-    for (var i = 0; i < r_used; i++) {
-      r_digits[i] = digits[i] & a_digits[i];
-    }
-    return new _Bigint(neg, r_used, r_digits);
-  }
-
-  // Return abs(this) &~ abs(a) with sign set according to neg.
-  _Bigint _absAndNotSetSign(_Bigint a, bool neg) {
-    var r_used = _used;
-    var digits = _digits;
-    var a_digits = a._digits;
-    var r_digits = new Uint32List(r_used + (r_used & 1));
-    var m = (r_used < a._used) ? r_used : a._used;
-    for (var i = 0; i < m; i++) {
-      r_digits[i] = digits[i] & ~a_digits[i];
-    }
-    for (var i = m; i < r_used; i++) {
-      r_digits[i] = digits[i];
-    }
-    return new _Bigint(neg, r_used, r_digits);
-  }
-
-  // Return abs(this) | abs(a) with sign set according to neg.
-  _Bigint _absOrSetSign(_Bigint a, bool neg) {
-    var used = _used;
-    var a_used = a._used;
-    var r_used = (used > a_used) ? used : a_used;
-    var digits = _digits;
-    var a_digits = a._digits;
-    var r_digits = new Uint32List(r_used + (r_used & 1));
-    var l, m;
-    if (used < a_used) {
-      l = a;
-      m = used;
-    } else {
-      l = this;
-      m = a_used;
-    }
-    for (var i = 0; i < m; i++) {
-      r_digits[i] = digits[i] | a_digits[i];
-    }
-    var l_digits = l._digits;
-    for (var i = m; i < r_used; i++) {
-      r_digits[i] = l_digits[i];
-    }
-    return new _Bigint(neg, r_used, r_digits);
-  }
-
-  // Return abs(this) ^ abs(a) with sign set according to neg.
-  _Bigint _absXorSetSign(_Bigint a, bool neg) {
-    var used = _used;
-    var a_used = a._used;
-    var r_used = (used > a_used) ? used : a_used;
-    var digits = _digits;
-    var a_digits = a._digits;
-    var r_digits = new Uint32List(r_used + (r_used & 1));
-    var l, m;
-    if (used < a_used) {
-      l = a;
-      m = used;
-    } else {
-      l = this;
-      m = a_used;
-    }
-    for (var i = 0; i < m; i++) {
-      r_digits[i] = digits[i] ^ a_digits[i];
-    }
-    var l_digits = l._digits;
-    for (var i = m; i < r_used; i++) {
-      r_digits[i] = l_digits[i];
-    }
-    return new _Bigint(neg, r_used, r_digits);
-  }
-
-  // Return this & a.
-  _Bigint _and(_Bigint a) {
-    if (_neg == a._neg) {
-      if (_neg) {
-        // (-this) & (-a) == ~(this-1) & ~(a-1)
-        //                == ~((this-1) | (a-1))
-        //                == -(((this-1) | (a-1)) + 1)
-        _Bigint t1 = _absSubSetSign(_ONE, true);
-        _Bigint a1 = a._absSubSetSign(_ONE, true);
-        // Result cannot be zero if this and a are negative.
-        return t1._absOrSetSign(a1, true)._absAddSetSign(_ONE, true);
-      }
-      return _absAndSetSign(a, false);
-    }
-    // _neg != a._neg
-    var p, n;
-    if (_neg) {
-      p = a;
-      n = this;
-    } else {
-      // & is symmetric.
-      p = this;
-      n = a;
-    }
-    // p & (-n) == p & ~(n-1) == p &~ (n-1)
-    _Bigint n1 = n._absSubSetSign(_ONE, false);
-    return p._absAndNotSetSign(n1, false);
-  }
-
-  // Return this &~ a.
-  _Bigint _andNot(_Bigint a) {
-    if (_neg == a._neg) {
-      if (_neg) {
-        // (-this) &~ (-a) == ~(this-1) &~ ~(a-1)
-        //                 == ~(this-1) & (a-1)
-        //                 == (a-1) &~ (this-1)
-        _Bigint t1 = _absSubSetSign(_ONE, true);
-        _Bigint a1 = a._absSubSetSign(_ONE, true);
-        return a1._absAndNotSetSign(t1, false);
-      }
-      return _absAndNotSetSign(a, false);
-    }
-    if (_neg) {
-      // (-this) &~ a == ~(this-1) &~ a
-      //              == ~(this-1) & ~a
-      //              == ~((this-1) | a)
-      //              == -(((this-1) | a) + 1)
-      _Bigint t1 = _absSubSetSign(_ONE, true);
-      // Result cannot be zero if this is negative and a is positive.
-      return t1._absOrSetSign(a, true)._absAddSetSign(_ONE, true);
-    }
-    // this &~ (-a) == this &~ ~(a-1) == this & (a-1)
-    _Bigint a1 = a._absSubSetSign(_ONE, true);
-    return _absAndSetSign(a1, false);
-  }
-
-  // Return this | a.
-  _Bigint _or(_Bigint a) {
-    if (_neg == a._neg) {
-      if (_neg) {
-        // (-this) | (-a) == ~(this-1) | ~(a-1)
-        //                == ~((this-1) & (a-1))
-        //                == -(((this-1) & (a-1)) + 1)
-        _Bigint t1 = _absSubSetSign(_ONE, true);
-        _Bigint a1 = a._absSubSetSign(_ONE, true);
-        // Result cannot be zero if this and a are negative.
-        return t1._absAndSetSign(a1, true)._absAddSetSign(_ONE, true);
-      }
-      return _absOrSetSign(a, false);
-    }
-    // _neg != a._neg
-    var p, n;
-    if (_neg) {
-      p = a;
-      n = this;
-    } else {
-      // | is symmetric.
-      p = this;
-      n = a;
-    }
-    // p | (-n) == p | ~(n-1) == ~((n-1) &~ p) == -(~((n-1) &~ p) + 1)
-    _Bigint n1 = n._absSubSetSign(_ONE, true);
-    // Result cannot be zero if only one of this or a is negative.
-    return n1._absAndNotSetSign(p, true)._absAddSetSign(_ONE, true);
-  }
-
-  // Return this ^ a.
-  _Bigint _xor(_Bigint a) {
-    if (_neg == a._neg) {
-      if (_neg) {
-        // (-this) ^ (-a) == ~(this-1) ^ ~(a-1) == (this-1) ^ (a-1)
-        _Bigint t1 = _absSubSetSign(_ONE, true);
-        _Bigint a1 = a._absSubSetSign(_ONE, true);
-        return t1._absXorSetSign(a1, false);
-      }
-      return _absXorSetSign(a, false);
-    }
-    // _neg != a._neg
-    var p, n;
-    if (_neg) {
-      p = a;
-      n = this;
-    } else {
-      // ^ is symmetric.
-      p = this;
-      n = a;
-    }
-    // p ^ (-n) == p ^ ~(n-1) == ~(p ^ (n-1)) == -((p ^ (n-1)) + 1)
-    _Bigint n1 = n._absSubSetSign(_ONE, true);
-    // Result cannot be zero if only one of this or a is negative.
-    return p._absXorSetSign(n1, true)._absAddSetSign(_ONE, true);
-  }
-
-  // Return ~this.
-  _Bigint _not() {
-    if (_neg) {
-      // ~(-this) == ~(~(this-1)) == this-1
-      return _absSubSetSign(_ONE, false);
-    }
-    // ~this == -this-1 == -(this+1)
-    // Result cannot be zero if this is positive.
-    return _absAddSetSign(_ONE, true);
-  }
-
-  // Return this + a.
-  _Bigint _add(_Bigint a) {
-    var neg = _neg;
-    if (neg == a._neg) {
-      // this + a == this + a
-      // (-this) + (-a) == -(this + a)
-      return _absAddSetSign(a, neg);
-    }
-    // this + (-a) == this - a == -(this - a)
-    // (-this) + a == a - this == -(this - a)
-    if (_absCompare(a) >= 0) {
-      return _absSubSetSign(a, neg);
-    }
-    return a._absSubSetSign(this, !neg);
-  }
-
-  // Return this - a.
-  _Bigint _sub(_Bigint a) {
-    var neg = _neg;
-    if (neg != a._neg) {
-      // this - (-a) == this + a
-      // (-this) - a == -(this + a)
-      return _absAddSetSign(a, neg);
-    }
-    // this - a == this - a == -(this - a)
-    // (-this) - (-a) == a - this == -(this - a)
-    if (_absCompare(a) >= 0) {
-      return _absSubSetSign(a, neg);
-    }
-    return a._absSubSetSign(this, !neg);
-  }
-
-  // Multiply and accumulate.
-  // Input:
-  //   x_digits[xi]: multiplier digit x.
-  //   m_digits[i..i+n-1]: multiplicand digits.
-  //   a_digits[j..j+n-1]: accumulator digits.
-  // Operation:
-  //   a_digits[j..j+n] += x_digits[xi]*m_digits[i..i+n-1].
-  //   return 1.
-  // Note: Intrinsics on 64-bit platforms process digit pairs at even indices
-  //   and return 2.
-  static int _mulAdd(Uint32List x_digits, int xi, Uint32List m_digits, int i,
-      Uint32List a_digits, int j, int n) {
-    // Verify that digit pairs are accessible for 64-bit processing.
-    assert(x_digits.length > (xi | 1));
-    assert(m_digits.length > ((i + n - 1) | 1));
-    assert(a_digits.length > ((j + n) | 1));
-    int x = x_digits[xi];
-    if (x == 0) {
-      // No-op if x is 0.
-      return 1;
-    }
-    int c = 0;
-    int xl = x & _DIGIT2_MASK;
-    int xh = x >> _DIGIT2_BITS;
-    while (--n >= 0) {
-      int l = m_digits[i] & _DIGIT2_MASK;
-      int h = m_digits[i++] >> _DIGIT2_BITS;
-      int m = xh * l + h * xl;
-      l = xl * l + ((m & _DIGIT2_MASK) << _DIGIT2_BITS) + a_digits[j] + c;
-      c = (l >> _DIGIT_BITS) + (m >> _DIGIT2_BITS) + xh * h;
-      a_digits[j++] = l & _DIGIT_MASK;
-    }
-    while (c != 0) {
-      int l = a_digits[j] + c;
-      c = l >> _DIGIT_BITS;
-      a_digits[j++] = l & _DIGIT_MASK;
-    }
-    return 1;
-  }
-
-  // Square and accumulate.
-  // Input:
-  //   x_digits[i..used-1]: digits of operand being squared.
-  //   a_digits[2*i..i+used-1]: accumulator digits.
-  // Operation:
-  //   a_digits[2*i..i+used-1] += x_digits[i]*x_digits[i] +
-  //                              2*x_digits[i]*x_digits[i+1..used-1].
-  //   return 1.
-  // Note: Intrinsics on 64-bit platforms process digit pairs at even indices
-  //   and return 2.
-  static int _sqrAdd(
-      Uint32List x_digits, int i, Uint32List a_digits, int used) {
-    // Verify that digit pairs are accessible for 64-bit processing.
-    assert(x_digits.length > ((used - 1) | 1));
-    assert(a_digits.length > ((i + used - 1) | 1));
-    int x = x_digits[i];
-    if (x == 0) return 1;
-    int j = 2 * i;
-    int c = 0;
-    int xl = x & _DIGIT2_MASK;
-    int xh = x >> _DIGIT2_BITS;
-    int m = 2 * xh * xl;
-    int l = xl * xl + ((m & _DIGIT2_MASK) << _DIGIT2_BITS) + a_digits[j];
-    c = (l >> _DIGIT_BITS) + (m >> _DIGIT2_BITS) + xh * xh;
-    a_digits[j] = l & _DIGIT_MASK;
-    x <<= 1;
-    xl = x & _DIGIT2_MASK;
-    xh = x >> _DIGIT2_BITS;
-    int n = used - i - 1;
-    int k = i + 1;
-    j++;
-    while (--n >= 0) {
-      int l = x_digits[k] & _DIGIT2_MASK;
-      int h = x_digits[k++] >> _DIGIT2_BITS;
-      int m = xh * l + h * xl;
-      l = xl * l + ((m & _DIGIT2_MASK) << _DIGIT2_BITS) + a_digits[j] + c;
-      c = (l >> _DIGIT_BITS) + (m >> _DIGIT2_BITS) + xh * h;
-      a_digits[j++] = l & _DIGIT_MASK;
-    }
-    c += a_digits[i + used];
-    if (c >= _DIGIT_BASE) {
-      a_digits[i + used] = c - _DIGIT_BASE;
-      a_digits[i + used + 1] = 1;
-    } else {
-      a_digits[i + used] = c;
-    }
-    return 1;
-  }
-
-  // Return this * a.
-  _Bigint _mul(_Bigint a) {
-    // TODO(regis): Use karatsuba multiplication when appropriate.
-    var used = _used;
-    var a_used = a._used;
-    if (used == 0 || a_used == 0) {
-      return _ZERO;
-    }
-    var r_used = used + a_used;
-    var digits = _digits;
-    var a_digits = a._digits;
-    var r_digits = new Uint32List(r_used + (r_used & 1));
-    var i = 0;
-    while (i < a_used) {
-      i += _mulAdd(a_digits, i, digits, 0, r_digits, i, used);
-    }
-    return new _Bigint(_neg != a._neg, r_used, r_digits);
-  }
-
-  // r_digits[0..r_used-1] = x_digits[0..x_used-1]*a_digits[0..a_used-1].
-  // Return r_used = x_used + a_used.
-  static int _mulDigits(Uint32List x_digits, int x_used, Uint32List a_digits,
-      int a_used, Uint32List r_digits) {
-    var r_used = x_used + a_used;
-    var i = r_used + (r_used & 1);
-    assert(r_digits.length >= i);
-    while (--i >= 0) {
-      r_digits[i] = 0;
-    }
-    i = 0;
-    while (i < a_used) {
-      i += _mulAdd(a_digits, i, x_digits, 0, r_digits, i, x_used);
-    }
-    return r_used;
-  }
-
-  // Return this^2.
-  _Bigint _sqr() {
-    var used = _used;
-    if (used == 0) {
-      return _ZERO;
-    }
-    var r_used = 2 * used;
-    var digits = _digits;
-    var r_digits = new Uint32List(r_used);
-    // Since r_used is even, no need for a leading zero for 64-bit processing.
-    var i = 0;
-    while (i < used - 1) {
-      i += _sqrAdd(digits, i, r_digits, used);
-    }
-    // The last step is already done if digit pairs were processed above.
-    if (i < used) {
-      _mulAdd(digits, i, digits, i, r_digits, 2 * i, 1);
-    }
-    return new _Bigint(false, r_used, r_digits);
-  }
-
-  // r_digits[0..r_used-1] = x_digits[0..x_used-1]*x_digits[0..x_used-1].
-  // Return r_used = 2*x_used.
-  static int _sqrDigits(Uint32List x_digits, int x_used, Uint32List r_digits) {
-    var r_used = 2 * x_used;
-    assert(r_digits.length >= r_used);
-    // Since r_used is even, no need for a leading zero for 64-bit processing.
-    var i = r_used;
-    while (--i >= 0) {
-      r_digits[i] = 0;
-    }
-    i = 0;
-    while (i < x_used - 1) {
-      i += _sqrAdd(x_digits, i, r_digits, x_used);
-    }
-    // The last step is already done if digit pairs were processed above.
-    if (i < x_used) {
-      _mulAdd(x_digits, i, x_digits, i, r_digits, 2 * i, 1);
-    }
-    return r_used;
-  }
-
-  // Indices of the arguments of _estQuotientDigit.
-  // For 64-bit processing by intrinsics on 64-bit platforms, the top digit pair
-  // of divisor y is provided in the args array, and a 64-bit estimated quotient
-  // is returned. However, on 32-bit platforms, the low 32-bit digit is ignored
-  // and only one 32-bit digit is returned as the estimated quotient.
-  static const int _YT_LO = 0; // Low digit of top digit pair of y, for 64-bit.
-  static const int _YT = 1; // Top digit of divisor y.
-  static const int _QD = 2; // Estimated quotient.
-  static const int _QD_HI = 3; // High digit of estimated quotient, for 64-bit.
-
-  // Operation:
-  //   Estimate args[_QD] = digits[i-1..i] ~/ args[_YT]
-  //   return 1
-  // Note: Intrinsics on 64-bit platforms process a digit pair (i always odd):
-  //   Estimate args[_QD.._QD_HI] = digits[i-3..i] ~/ args[_YT_LO.._YT]
-  //   return 2
-  static int _estQuotientDigit(Uint32List args, Uint32List digits, int i) {
-    // Verify that digit pairs are accessible for 64-bit processing.
-    assert(digits.length >= 4);
-    if (digits[i] == args[_YT]) {
-      args[_QD] = _DIGIT_MASK;
-    } else {
-      // Chop off one bit, since a Mint cannot hold 2 DIGITs.
-      var qd = ((digits[i] << (_DIGIT_BITS - 1)) | (digits[i - 1] >> 1)) ~/
-          (args[_YT] >> 1);
-      if (qd > _DIGIT_MASK) {
-        args[_QD] = _DIGIT_MASK;
-      } else {
-        args[_QD] = qd;
-      }
-    }
-    return 1;
-  }
-
-  // Return trunc(this / a), a != 0.
-  _Bigint _div(_Bigint a) {
-    assert(a._used > 0);
-    if (_used < a._used) {
-      return _ZERO;
-    }
-    _divRem(a);
-    // Return quotient, i.e.
-    // _lastQuoRem_digits[_lastRem_used.._lastQuoRem_used-1] with proper sign.
-    var lastQuo_used = _lastQuoRem_used - _lastRem_used;
-    var quo_digits = _cloneDigits(
-        _lastQuoRem_digits, _lastRem_used, _lastQuoRem_used, lastQuo_used);
-    var quo = new _Bigint(false, lastQuo_used, quo_digits);
-    if ((_neg != a._neg) && (quo._used > 0)) {
-      quo = quo._negate();
-    }
-    return quo;
-  }
-
-  // Return this - a * trunc(this / a), a != 0.
-  _Bigint _rem(_Bigint a) {
-    assert(a._used > 0);
-    if (_used < a._used) {
-      return this;
-    }
-    _divRem(a);
-    // Return remainder, i.e.
-    // denormalized _lastQuoRem_digits[0.._lastRem_used-1] with proper sign.
-    var rem_digits =
-        _cloneDigits(_lastQuoRem_digits, 0, _lastRem_used, _lastRem_used);
-    var rem = new _Bigint(false, _lastRem_used, rem_digits);
-    if (_lastRem_nsh > 0) {
-      rem = rem._rShift(_lastRem_nsh); // Denormalize remainder.
-    }
-    if (_neg && (rem._used > 0)) {
-      rem = rem._negate();
-    }
-    return rem;
-  }
-
-  // Cache concatenated positive quotient and normalized positive remainder.
-  void _divRem(_Bigint a) {
-    // Check if result is already cached (identical on Bigint is too expensive).
-    if ((this._used == _lastDividend_used) &&
-        (a._used == _lastDivisor_used) &&
-        identical(this._digits, _lastDividend_digits) &&
-        identical(a._digits, _lastDivisor_digits)) {
-      return;
-    }
-    var nsh = _DIGIT_BITS - _nbits(a._digits[a._used - 1]);
-    // For 64-bit processing, make sure y has an even number of digits.
-    if (a._used.isOdd) {
-      nsh += _DIGIT_BITS;
-    }
-    // Concatenated positive quotient and normalized positive remainder.
-    var r_digits;
-    var r_used;
-    // Normalized positive divisor.
-    var y_digits;
-    var y_used;
-    if (nsh > 0) {
-      y_digits = new Uint32List(a._used + 5); // +5 for norm. and 64-bit.
-      y_used = _lShiftDigits(a._digits, a._used, nsh, y_digits);
-      r_digits = new Uint32List(_used + 5); // +5 for normalization and 64-bit.
-      r_used = _lShiftDigits(_digits, _used, nsh, r_digits);
-    } else {
-      y_digits = a._digits;
-      y_used = a._used;
-      r_digits = _cloneDigits(_digits, 0, _used, _used + 2);
-      r_used = _used;
-    }
-    Uint32List yt_qd = new Uint32List(4);
-    yt_qd[_YT_LO] = y_digits[y_used - 2];
-    yt_qd[_YT] = y_digits[y_used - 1];
-    // For 64-bit processing, make sure y_used, i, and j are even.
-    assert(y_used.isEven);
-    var i = r_used + (r_used & 1);
-    var j = i - y_used;
-    // t_digits is a temporary array of i digits.
-    var t_digits = new Uint32List(i);
-    var t_used = _dlShiftDigits(y_digits, y_used, j, t_digits);
-    // Explicit first division step in case normalized dividend is larger or
-    // equal to shifted normalized divisor.
-    if (_compareDigits(r_digits, r_used, t_digits, t_used) >= 0) {
-      assert(i == r_used);
-      r_digits[r_used++] = 1; // Quotient = 1.
-      // Subtract divisor from remainder.
-      _absSub(r_digits, r_used, t_digits, t_used, r_digits);
-    } else {
-      // Account for possible carry in _mulAdd step.
-      r_digits[r_used++] = 0;
-    }
-    r_digits[r_used] = 0; // Leading zero for 64-bit processing.
-    // Negate y so we can later use _mulAdd instead of non-existent _mulSub.
-    var ny_digits = new Uint32List(y_used + 2);
-    ny_digits[y_used] = 1;
-    _absSub(ny_digits, y_used + 1, y_digits, y_used, ny_digits);
-    // ny_digits is read-only and has y_used digits (possibly including several
-    // leading zeros) plus a leading zero for 64-bit processing.
-    // r_digits is modified during iteration.
-    // r_digits[0..y_used-1] is the current remainder.
-    // r_digits[y_used..r_used-1] is the current quotient.
-    --i;
-    while (j > 0) {
-      var d0 = _estQuotientDigit(yt_qd, r_digits, i);
-      j -= d0;
-      var d1 = _mulAdd(yt_qd, _QD, ny_digits, 0, r_digits, j, y_used);
-      // _estQuotientDigit and _mulAdd must agree on the number of digits to
-      // process.
-      assert(d0 == d1);
-      if (d0 == 1) {
-        if (r_digits[i] < yt_qd[_QD]) {
-          var t_used = _dlShiftDigits(ny_digits, y_used, j, t_digits);
-          _absSub(r_digits, r_used, t_digits, t_used, r_digits);
-          while (r_digits[i] < --yt_qd[_QD]) {
-            _absSub(r_digits, r_used, t_digits, t_used, r_digits);
-          }
-        }
-      } else {
-        assert(d0 == 2);
-        assert(r_digits[i] <= yt_qd[_QD_HI]);
-        if ((r_digits[i] < yt_qd[_QD_HI]) || (r_digits[i - 1] < yt_qd[_QD])) {
-          var t_used = _dlShiftDigits(ny_digits, y_used, j, t_digits);
-          _absSub(r_digits, r_used, t_digits, t_used, r_digits);
-          if (yt_qd[_QD] == 0) {
-            --yt_qd[_QD_HI];
-          }
-          --yt_qd[_QD];
-          assert(r_digits[i] <= yt_qd[_QD_HI]);
-          while (
-              (r_digits[i] < yt_qd[_QD_HI]) || (r_digits[i - 1] < yt_qd[_QD])) {
-            _absSub(r_digits, r_used, t_digits, t_used, r_digits);
-            if (yt_qd[_QD] == 0) {
-              --yt_qd[_QD_HI];
-            }
-            --yt_qd[_QD];
-            assert(r_digits[i] <= yt_qd[_QD_HI]);
-          }
-        }
-      }
-      i -= d0;
-    }
-    // Cache result.
-    _lastDividend_digits = _digits;
-    _lastDividend_used = _used;
-    _lastDivisor_digits = a._digits;
-    _lastDivisor_used = a._used;
-    _lastQuoRem_digits = r_digits;
-    _lastQuoRem_used = r_used;
-    _lastRem_used = y_used;
-    _lastRem_nsh = nsh;
-  }
-
-  // Customized version of _rem() minimizing allocations for use in reduction.
-  // Input:
-  //   x_digits[0..x_used-1]: positive dividend.
-  //   y_digits[0..y_used-1]: normalized positive divisor.
-  //   ny_digits[0..y_used-1]: negated y_digits.
-  //   nsh: normalization shift amount.
-  //   yt_qd: top y digit(s) and place holder for estimated quotient digit(s).
-  //   t_digits: temp array of 2*y_used digits.
-  //   r_digits: result digits array large enough to temporarily hold
-  //             concatenated quotient and normalized remainder.
-  // Output:
-  //   r_digits[0..r_used-1]: positive remainder.
-  // Returns r_used.
-  static int _remDigits(
-      Uint32List x_digits,
-      int x_used,
-      Uint32List y_digits,
-      int y_used,
-      Uint32List ny_digits,
-      int nsh,
-      Uint32List yt_qd,
-      Uint32List t_digits,
-      Uint32List r_digits) {
-    // Initialize r_digits to normalized positive dividend.
-    var r_used = _lShiftDigits(x_digits, x_used, nsh, r_digits);
-    // For 64-bit processing, make sure y_used, i, and j are even.
-    assert(y_used.isEven);
-    var i = r_used + (r_used & 1);
-    var j = i - y_used;
-    var t_used = _dlShiftDigits(y_digits, y_used, j, t_digits);
-    // Explicit first division step in case normalized dividend is larger or
-    // equal to shifted normalized divisor.
-    if (_compareDigits(r_digits, r_used, t_digits, t_used) >= 0) {
-      assert(i == r_used);
-      r_digits[r_used++] = 1; // Quotient = 1.
-      // Subtract divisor from remainder.
-      _absSub(r_digits, r_used, t_digits, t_used, r_digits);
-    } else {
-      // Account for possible carry in _mulAdd step.
-      r_digits[r_used++] = 0;
-    }
-    r_digits[r_used] = 0; // Leading zero for 64-bit processing.
-    // Negated y_digits passed in ny_digits allow the use of _mulAdd instead of
-    // unimplemented _mulSub.
-    // ny_digits is read-only and has y_used digits (possibly including several
-    // leading zeros) plus a leading zero for 64-bit processing.
-    // r_digits is modified during iteration.
-    // r_digits[0..y_used-1] is the current remainder.
-    // r_digits[y_used..r_used-1] is the current quotient.
-    --i;
-    while (j > 0) {
-      var d0 = _estQuotientDigit(yt_qd, r_digits, i);
-      j -= d0;
-      var d1 = _mulAdd(yt_qd, _QD, ny_digits, 0, r_digits, j, y_used);
-      // _estQuotientDigit and _mulAdd must agree on the number of digits to
-      // process.
-      assert(d0 == d1);
-      if (d0 == 1) {
-        if (r_digits[i] < yt_qd[_QD]) {
-          var t_used = _dlShiftDigits(ny_digits, y_used, j, t_digits);
-          _absSub(r_digits, r_used, t_digits, t_used, r_digits);
-          while (r_digits[i] < --yt_qd[_QD]) {
-            _absSub(r_digits, r_used, t_digits, t_used, r_digits);
-          }
-        }
-      } else {
-        assert(d0 == 2);
-        assert(r_digits[i] <= yt_qd[_QD_HI]);
-        if ((r_digits[i] < yt_qd[_QD_HI]) || (r_digits[i - 1] < yt_qd[_QD])) {
-          var t_used = _dlShiftDigits(ny_digits, y_used, j, t_digits);
-          _absSub(r_digits, r_used, t_digits, t_used, r_digits);
-          if (yt_qd[_QD] == 0) {
-            --yt_qd[_QD_HI];
-          }
-          --yt_qd[_QD];
-          assert(r_digits[i] <= yt_qd[_QD_HI]);
-          while (
-              (r_digits[i] < yt_qd[_QD_HI]) || (r_digits[i - 1] < yt_qd[_QD])) {
-            _absSub(r_digits, r_used, t_digits, t_used, r_digits);
-            if (yt_qd[_QD] == 0) {
-              --yt_qd[_QD_HI];
-            }
-            --yt_qd[_QD];
-            assert(r_digits[i] <= yt_qd[_QD_HI]);
-          }
-        }
-      }
-      i -= d0;
-    }
-    // Return remainder, i.e. denormalized r_digits[0..y_used-1].
-    r_used = y_used;
-    if (nsh > 0) {
-      // Denormalize remainder.
-      r_used = _rShiftDigits(r_digits, r_used, nsh, r_digits);
-    }
-    return r_used;
-  }
-
-  int get hashCode => this;
-  int get _identityHashCode => this;
-
-  int operator ~() {
-    return _not()._toValidInt();
-  }
-
-  int get bitLength {
-    if (_used == 0) return 0;
-    if (_neg) return (~this).bitLength;
-    return _DIGIT_BITS * (_used - 1) + _nbits(_digits[_used - 1]);
-  }
-
-  // This method must support smi._toBigint()._shrFromInt(int).
-  int _shrFromInt(int other) {
-    if (_used == 0) return other; // Shift amount is zero.
-    if (_neg) throw new RangeError.range(this, 0, null);
-    assert(_DIGIT_BITS == 32); // Otherwise this code needs to be revised.
-    var shift;
-    if ((_used > 2) || ((_used == 2) && (_digits[1] > 0x10000000))) {
-      if (other < 0) {
-        return -1;
-      } else {
-        return 0;
-      }
-    } else {
-      shift = ((_used == 2) ? (_digits[1] << _DIGIT_BITS) : 0) + _digits[0];
-    }
-    return other._toBigint()._rShift(shift)._toValidInt();
-  }
-
-  // This method must support smi._toBigint()._shlFromInt(int).
-  // An out of memory exception is thrown if the result cannot be allocated.
-  int _shlFromInt(int other) {
-    if (_used == 0) return other; // Shift amount is zero.
-    if (_neg) throw new RangeError.range(this, 0, null);
-    assert(_DIGIT_BITS == 32); // Otherwise this code needs to be revised.
-    var shift;
-    if (_used > 2 || (_used == 2 && _digits[1] > 0x10000000)) {
-      if (other == 0) return 0; // Shifted value is zero.
-      throw new OutOfMemoryError();
-    } else {
-      shift = ((_used == 2) ? (_digits[1] << _DIGIT_BITS) : 0) + _digits[0];
-    }
-    return other._toBigint()._lShift(shift)._toValidInt();
-  }
-
-  // Overriden operators and methods.
-
-  // The following operators override operators of _IntegerImplementation for
-  // efficiency, but are not necessary for correctness. They shortcut native
-  // calls that would return null because the receiver is _Bigint.
-  num operator +(num other) {
-    return other._toBigintOrDouble()._addFromInteger(this);
-  }
-
-  num operator -(num other) {
-    return other._toBigintOrDouble()._subFromInteger(this);
-  }
-
-  num operator *(num other) {
-    return other._toBigintOrDouble()._mulFromInteger(this);
-  }
-
-  int operator ~/(num other) {
-    return other._toBigintOrDouble()._truncDivFromInteger(this);
-  }
-
-  num operator %(num other) {
-    return other._toBigintOrDouble()._moduloFromInteger(this);
-  }
-
-  int operator &(int other) {
-    return other._toBigint()._bitAndFromInteger(this);
-  }
-
-  int operator |(int other) {
-    return other._toBigint()._bitOrFromInteger(this);
-  }
-
-  int operator ^(int other) {
-    return other._toBigint()._bitXorFromInteger(this);
-  }
-
-  int operator >>(int other) {
-    return other._toBigint()._shrFromInt(this);
-  }
-
-  int operator <<(int other) {
-    return other._toBigint()._shlFromInt(this);
-  }
-  // End of operator shortcuts.
-
-  int operator -() {
-    return _negate()._toValidInt();
-  }
-
-  int get sign {
-    return (_used == 0) ? 0 : _neg ? -1 : 1;
-  }
-
-  bool get isEven => _used == 0 || (_digits[0] & 1) == 0;
-  bool get isNegative => _neg;
-
-  String _toPow2String(int radix) {
-    if (_used == 0) return "0";
-    assert(radix & (radix - 1) == 0);
-    final bitsPerChar = radix.bitLength - 1;
-    final firstcx = _neg ? 1 : 0; // Index of first char in str after the sign.
-    final lastdx = _used - 1; // Index of last digit in bigint.
-    final bitLength = lastdx * _DIGIT_BITS + _nbits(_digits[lastdx]);
-    // Index of char in str. Initialize with str length.
-    var cx = firstcx + (bitLength + bitsPerChar - 1) ~/ bitsPerChar;
-    _OneByteString str = _OneByteString._allocate(cx);
-    str._setAt(0, 0x2d); // '-'. Is overwritten if not negative.
-    final mask = radix - 1;
-    var dx = 0; // Digit index in bigint.
-    var bx = 0; // Bit index in bigint digit.
-    do {
-      var ch;
-      if (bx > (_DIGIT_BITS - bitsPerChar)) {
-        ch = _digits[dx++] >> bx;
-        bx += bitsPerChar - _DIGIT_BITS;
-        if (dx <= lastdx) {
-          ch |= (_digits[dx] & ((1 << bx) - 1)) << (bitsPerChar - bx);
-        }
-      } else {
-        ch = (_digits[dx] >> bx) & mask;
-        bx += bitsPerChar;
-        if (bx >= _DIGIT_BITS) {
-          bx -= _DIGIT_BITS;
-          dx++;
-        }
-      }
-      str._setAt(--cx, _IntegerImplementation._digits.codeUnitAt(ch));
-    } while (cx > firstcx);
-    return str;
-  }
-
-  int _bitAndFromSmi(_Smi other) => _bitAndFromInteger(other);
-
-  int _bitAndFromInteger(int other) {
-    return other._toBigint()._and(this)._toValidInt();
-  }
-
-  int _bitOrFromInteger(int other) {
-    return other._toBigint()._or(this)._toValidInt();
-  }
-
-  int _bitXorFromInteger(int other) {
-    return other._toBigint()._xor(this)._toValidInt();
-  }
-
-  int _addFromInteger(int other) {
-    return other._toBigint()._add(this)._toValidInt();
-  }
-
-  int _subFromInteger(int other) {
-    return other._toBigint()._sub(this)._toValidInt();
-  }
-
-  int _mulFromInteger(int other) {
-    return other._toBigint()._mul(this)._toValidInt();
-  }
-
-  int _truncDivFromInteger(int other) {
-    if (_used == 0) {
-      throw const IntegerDivisionByZeroException();
-    }
-    return other._toBigint()._div(this)._toValidInt();
-  }
-
-  int _moduloFromInteger(int other) {
-    if (_used == 0) {
-      throw const IntegerDivisionByZeroException();
-    }
-    _Bigint result = other._toBigint()._rem(this);
-    if (result._neg) {
-      if (_neg) {
-        result = result._sub(this);
-      } else {
-        result = result._add(this);
-      }
-    }
-    return result._toValidInt();
-  }
-
-  int _remainderFromInteger(int other) {
-    if (_used == 0) {
-      throw const IntegerDivisionByZeroException();
-    }
-    return other._toBigint()._rem(this)._toValidInt();
-  }
-
-  bool _greaterThanFromInteger(int other) {
-    return other._toBigint()._compare(this) > 0;
-  }
-
-  bool _equalToInteger(int other) {
-    return other._toBigint()._compare(this) == 0;
-  }
-
-  // Returns pow(this, e) % m, with e >= 0, m > 0.
-  int modPow(int e, int m) {
-    if (e is! int) {
-      throw new ArgumentError.value(e, "exponent", "not an integer");
-    }
-    if (m is! int) {
-      throw new ArgumentError.value(m, "modulus", "not an integer");
-    }
-    if (e < 0) throw new RangeError.range(e, 0, null, "exponent");
-    if (m <= 0) throw new RangeError.range(m, 1, null, "modulus");
-    if (e == 0) return 1;
-    final mAsBigint = m._toBigint();
-    final m_used = mAsBigint._used;
-    final m_used2p4 = 2 * m_used + 4;
-    final e_bitlen = e.bitLength;
-    if (e_bitlen <= 0) return 1;
-    final bool cannotUseMontgomery = mAsBigint.isEven || _abs() >= mAsBigint;
-    if (cannotUseMontgomery || e_bitlen < 64) {
-      _Reduction z = (cannotUseMontgomery || e_bitlen < 8)
-          ? new _Classic(mAsBigint)
-          : new _Montgomery(mAsBigint);
-      // TODO(regis): Should we use Barrett reduction for an even modulus and a
-      // large exponent?
-      var r_digits = new Uint32List(m_used2p4);
-      var r2_digits = new Uint32List(m_used2p4);
-      var g_digits = new Uint32List(m_used + (m_used & 1));
-      var g_used = z._convert(this, g_digits);
-      // Initialize r with g.
-      var j = g_used + (g_used & 1); // Copy leading zero if any.
-      while (--j >= 0) {
-        r_digits[j] = g_digits[j];
-      }
-      var r_used = g_used;
-      var r2_used;
-      var i = e_bitlen - 1;
-      while (--i >= 0) {
-        r2_used = z._sqr(r_digits, r_used, r2_digits);
-        if ((e & (1 << i)) != 0) {
-          r_used = z._mul(r2_digits, r2_used, g_digits, g_used, r_digits);
-        } else {
-          var t_digits = r_digits;
-          var t_used = r_used;
-          r_digits = r2_digits;
-          r_used = r2_used;
-          r2_digits = t_digits;
-          r2_used = t_used;
-        }
-      }
-      return z._revert(r_digits, r_used)._toValidInt();
-    }
-    final eAsBigint = e._toBigint();
-    var k;
-    if (e_bitlen < 18)
-      k = 1;
-    else if (e_bitlen < 48)
-      k = 3;
-    else if (e_bitlen < 144)
-      k = 4;
-    else if (e_bitlen < 768)
-      k = 5;
-    else
-      k = 6;
-    _Reduction z = new _Montgomery(mAsBigint);
-    var n = 3;
-    final k1 = k - 1;
-    final km = (1 << k) - 1;
-    List g_digits = new List(km + 1);
-    List g_used = new List(km + 1);
-    g_digits[1] = new Uint32List(m_used + (m_used & 1));
-    g_used[1] = z._convert(this, g_digits[1]);
-    if (k > 1) {
-      var g2_digits = new Uint32List(m_used2p4);
-      var g2_used = z._sqr(g_digits[1], g_used[1], g2_digits);
-      while (n <= km) {
-        g_digits[n] = new Uint32List(m_used2p4);
-        g_used[n] = z._mul(
-            g2_digits, g2_used, g_digits[n - 2], g_used[n - 2], g_digits[n]);
-        n += 2;
-      }
-    }
-    var w;
-    var is1 = true;
-    var r_digits = _ONE._digits;
-    var r_used = _ONE._used;
-    var r2_digits = new Uint32List(m_used2p4);
-    var r2_used;
-    var e_digits = eAsBigint._digits;
-    var j = eAsBigint._used - 1;
-    var i = _nbits(e_digits[j]) - 1;
-    while (j >= 0) {
-      if (i >= k1) {
-        w = (e_digits[j] >> (i - k1)) & km;
-      } else {
-        w = (e_digits[j] & ((1 << (i + 1)) - 1)) << (k1 - i);
-        if (j > 0) {
-          w |= e_digits[j - 1] >> (_DIGIT_BITS + i - k1);
-        }
-      }
-      n = k;
-      while ((w & 1) == 0) {
-        w >>= 1;
-        --n;
-      }
-      if ((i -= n) < 0) {
-        i += _DIGIT_BITS;
-        --j;
-      }
-      if (is1) {
-        // r == 1, don't bother squaring or multiplying it.
-        r_digits = new Uint32List(m_used2p4);
-        r_used = g_used[w];
-        var gw_digits = g_digits[w];
-        var ri = r_used + (r_used & 1); // Copy leading zero if any.
-        while (--ri >= 0) {
-          r_digits[ri] = gw_digits[ri];
-        }
-        is1 = false;
-      } else {
-        while (n > 1) {
-          r2_used = z._sqr(r_digits, r_used, r2_digits);
-          r_used = z._sqr(r2_digits, r2_used, r_digits);
-          n -= 2;
-        }
-        if (n > 0) {
-          r2_used = z._sqr(r_digits, r_used, r2_digits);
-        } else {
-          var t_digits = r_digits;
-          var t_used = r_used;
-          r_digits = r2_digits;
-          r_used = r2_used;
-          r2_digits = t_digits;
-          r2_used = t_used;
-        }
-        r_used = z._mul(r2_digits, r2_used, g_digits[w], g_used[w], r_digits);
-      }
-      while (j >= 0 && (e_digits[j] & (1 << i)) == 0) {
-        r2_used = z._sqr(r_digits, r_used, r2_digits);
-        var t_digits = r_digits;
-        var t_used = r_used;
-        r_digits = r2_digits;
-        r_used = r2_used;
-        r2_digits = t_digits;
-        r2_used = t_used;
-        if (--i < 0) {
-          i = _DIGIT_BITS - 1;
-          --j;
-        }
-      }
-    }
-    assert(!is1);
-    return z._revert(r_digits, r_used)._toValidInt();
-  }
-
-  // If inv is false, returns gcd(x, y).
-  // If inv is true and gcd(x, y) = 1, returns d, so that c*x + d*y = 1.
-  // If inv is true and gcd(x, y) != 1, throws Exception("Not coprime").
-  static int _binaryGcd(_Bigint x, _Bigint y, bool inv) {
-    var x_digits = x._digits;
-    var y_digits = y._digits;
-    var x_used = x._used;
-    var y_used = y._used;
-    var m_used = x_used > y_used ? x_used : y_used;
-    final m_len = m_used + (m_used & 1);
-    x_digits = _cloneDigits(x_digits, 0, x_used, m_len);
-    y_digits = _cloneDigits(y_digits, 0, y_used, m_len);
-    int s = 0;
-    if (inv) {
-      if ((y_used == 1) && (y_digits[0] == 1)) return 1;
-      if ((y_used == 0) || (y_digits[0].isEven && x_digits[0].isEven)) {
-        throw new Exception("Not coprime");
-      }
-    } else {
-      if (x_used == 0) {
-        throw new ArgumentError.value(0, "this", "must not be zero");
-      }
-      if (y_used == 0) {
-        throw new ArgumentError.value(0, "other", "must not be zero");
-      }
-      if (((x_used == 1) && (x_digits[0] == 1)) ||
-          ((y_used == 1) && (y_digits[0] == 1))) return 1;
-      bool xy_cloned = false;
-      while (((x_digits[0] & 1) == 0) && ((y_digits[0] & 1) == 0)) {
-        _rsh(x_digits, x_used, 1, x_digits);
-        _rsh(y_digits, y_used, 1, y_digits);
-        s++;
-      }
-      if (s >= _DIGIT_BITS) {
-        var sd = s >> _LOG2_DIGIT_BITS;
-        x_used -= sd;
-        y_used -= sd;
-        m_used -= sd;
-      }
-      if ((y_digits[0] & 1) == 1) {
-        var t_digits = x_digits;
-        var t_used = x_used;
-        x_digits = y_digits;
-        x_used = y_used;
-        y_digits = t_digits;
-        y_used = t_used;
-      }
-    }
-    var u_digits = _cloneDigits(x_digits, 0, x_used, m_len);
-    var v_digits = _cloneDigits(y_digits, 0, y_used, m_len + 2); // +2 for lsh.
-    final bool ac = (x_digits[0] & 1) == 0;
-
-    // Variables a, b, c, and d require one more digit.
-    final abcd_used = m_used + 1;
-    final abcd_len = abcd_used + (abcd_used & 1) + 2; // +2 to satisfy _absAdd.
-    var a_digits, b_digits, c_digits, d_digits;
-    bool a_neg, b_neg, c_neg, d_neg;
-    if (ac) {
-      a_digits = new Uint32List(abcd_len);
-      a_neg = false;
-      a_digits[0] = 1;
-      c_digits = new Uint32List(abcd_len);
-      c_neg = false;
-    }
-    b_digits = new Uint32List(abcd_len);
-    b_neg = false;
-    d_digits = new Uint32List(abcd_len);
-    d_neg = false;
-    d_digits[0] = 1;
-
-    while (true) {
-      while ((u_digits[0] & 1) == 0) {
-        _rsh(u_digits, m_used, 1, u_digits);
-        if (ac) {
-          if (((a_digits[0] & 1) == 1) || ((b_digits[0] & 1) == 1)) {
-            if (a_neg) {
-              if ((a_digits[m_used] != 0) ||
-                  (_compareDigits(a_digits, m_used, y_digits, m_used)) > 0) {
-                _absSub(a_digits, abcd_used, y_digits, m_used, a_digits);
-              } else {
-                _absSub(y_digits, m_used, a_digits, m_used, a_digits);
-                a_neg = false;
-              }
-            } else {
-              _absAdd(a_digits, abcd_used, y_digits, m_used, a_digits);
-            }
-            if (b_neg) {
-              _absAdd(b_digits, abcd_used, x_digits, m_used, b_digits);
-            } else if ((b_digits[m_used] != 0) ||
-                (_compareDigits(b_digits, m_used, x_digits, m_used) > 0)) {
-              _absSub(b_digits, abcd_used, x_digits, m_used, b_digits);
-            } else {
-              _absSub(x_digits, m_used, b_digits, m_used, b_digits);
-              b_neg = true;
-            }
-          }
-          _rsh(a_digits, abcd_used, 1, a_digits);
-        } else if ((b_digits[0] & 1) == 1) {
-          if (b_neg) {
-            _absAdd(b_digits, abcd_used, x_digits, m_used, b_digits);
-          } else if ((b_digits[m_used] != 0) ||
-              (_compareDigits(b_digits, m_used, x_digits, m_used) > 0)) {
-            _absSub(b_digits, abcd_used, x_digits, m_used, b_digits);
-          } else {
-            _absSub(x_digits, m_used, b_digits, m_used, b_digits);
-            b_neg = true;
-          }
-        }
-        _rsh(b_digits, abcd_used, 1, b_digits);
-      }
-      while ((v_digits[0] & 1) == 0) {
-        _rsh(v_digits, m_used, 1, v_digits);
-        if (ac) {
-          if (((c_digits[0] & 1) == 1) || ((d_digits[0] & 1) == 1)) {
-            if (c_neg) {
-              if ((c_digits[m_used] != 0) ||
-                  (_compareDigits(c_digits, m_used, y_digits, m_used) > 0)) {
-                _absSub(c_digits, abcd_used, y_digits, m_used, c_digits);
-              } else {
-                _absSub(y_digits, m_used, c_digits, m_used, c_digits);
-                c_neg = false;
-              }
-            } else {
-              _absAdd(c_digits, abcd_used, y_digits, m_used, c_digits);
-            }
-            if (d_neg) {
-              _absAdd(d_digits, abcd_used, x_digits, m_used, d_digits);
-            } else if ((d_digits[m_used] != 0) ||
-                (_compareDigits(d_digits, m_used, x_digits, m_used) > 0)) {
-              _absSub(d_digits, abcd_used, x_digits, m_used, d_digits);
-            } else {
-              _absSub(x_digits, m_used, d_digits, m_used, d_digits);
-              d_neg = true;
-            }
-          }
-          _rsh(c_digits, abcd_used, 1, c_digits);
-        } else if ((d_digits[0] & 1) == 1) {
-          if (d_neg) {
-            _absAdd(d_digits, abcd_used, x_digits, m_used, d_digits);
-          } else if ((d_digits[m_used] != 0) ||
-              (_compareDigits(d_digits, m_used, x_digits, m_used) > 0)) {
-            _absSub(d_digits, abcd_used, x_digits, m_used, d_digits);
-          } else {
-            _absSub(x_digits, m_used, d_digits, m_used, d_digits);
-            d_neg = true;
-          }
-        }
-        _rsh(d_digits, abcd_used, 1, d_digits);
-      }
-      if (_compareDigits(u_digits, m_used, v_digits, m_used) >= 0) {
-        _absSub(u_digits, m_used, v_digits, m_used, u_digits);
-        if (ac) {
-          if (a_neg == c_neg) {
-            var a_cmp_c =
-                _compareDigits(a_digits, abcd_used, c_digits, abcd_used);
-            if (a_cmp_c > 0) {
-              _absSub(a_digits, abcd_used, c_digits, abcd_used, a_digits);
-            } else {
-              _absSub(c_digits, abcd_used, a_digits, abcd_used, a_digits);
-              a_neg = !a_neg && (a_cmp_c != 0);
-            }
-          } else {
-            _absAdd(a_digits, abcd_used, c_digits, abcd_used, a_digits);
-          }
-        }
-        if (b_neg == d_neg) {
-          var b_cmp_d =
-              _compareDigits(b_digits, abcd_used, d_digits, abcd_used);
-          if (b_cmp_d > 0) {
-            _absSub(b_digits, abcd_used, d_digits, abcd_used, b_digits);
-          } else {
-            _absSub(d_digits, abcd_used, b_digits, abcd_used, b_digits);
-            b_neg = !b_neg && (b_cmp_d != 0);
-          }
-        } else {
-          _absAdd(b_digits, abcd_used, d_digits, abcd_used, b_digits);
-        }
-      } else {
-        _absSub(v_digits, m_used, u_digits, m_used, v_digits);
-        if (ac) {
-          if (c_neg == a_neg) {
-            var c_cmp_a =
-                _compareDigits(c_digits, abcd_used, a_digits, abcd_used);
-            if (c_cmp_a > 0) {
-              _absSub(c_digits, abcd_used, a_digits, abcd_used, c_digits);
-            } else {
-              _absSub(a_digits, abcd_used, c_digits, abcd_used, c_digits);
-              c_neg = !c_neg && (c_cmp_a != 0);
-            }
-          } else {
-            _absAdd(c_digits, abcd_used, a_digits, abcd_used, c_digits);
-          }
-        }
-        if (d_neg == b_neg) {
-          var d_cmp_b =
-              _compareDigits(d_digits, abcd_used, b_digits, abcd_used);
-          if (d_cmp_b > 0) {
-            _absSub(d_digits, abcd_used, b_digits, abcd_used, d_digits);
-          } else {
-            _absSub(b_digits, abcd_used, d_digits, abcd_used, d_digits);
-            d_neg = !d_neg && (d_cmp_b != 0);
-          }
-        } else {
-          _absAdd(d_digits, abcd_used, b_digits, abcd_used, d_digits);
-        }
-      }
-      // Exit loop if u == 0.
-      var i = m_used;
-      while ((i > 0) && (u_digits[i - 1] == 0)) --i;
-      if (i == 0) break;
-    }
-    if (!inv) {
-      if (s > 0) {
-        m_used = _lShiftDigits(v_digits, m_used, s, v_digits);
-      }
-      return new _Bigint(false, m_used, v_digits)._toValidInt();
-    }
-    // No inverse if v != 1.
-    var i = m_used - 1;
-    while ((i > 0) && (v_digits[i] == 0)) --i;
-    if ((i != 0) || (v_digits[0] != 1)) {
-      throw new Exception("Not coprime");
-    }
-
-    if (d_neg) {
-      if ((d_digits[m_used] != 0) ||
-          (_compareDigits(d_digits, m_used, x_digits, m_used) > 0)) {
-        _absSub(d_digits, abcd_used, x_digits, m_used, d_digits);
-        if ((d_digits[m_used] != 0) ||
-            (_compareDigits(d_digits, m_used, x_digits, m_used) > 0)) {
-          _absSub(d_digits, abcd_used, x_digits, m_used, d_digits);
-        } else {
-          _absSub(x_digits, m_used, d_digits, m_used, d_digits);
-          d_neg = false;
-        }
-      } else {
-        _absSub(x_digits, m_used, d_digits, m_used, d_digits);
-        d_neg = false;
-      }
-    } else if ((d_digits[m_used] != 0) ||
-        (_compareDigits(d_digits, m_used, x_digits, m_used) > 0)) {
-      _absSub(d_digits, abcd_used, x_digits, m_used, d_digits);
-      if ((d_digits[m_used] != 0) ||
-          (_compareDigits(d_digits, m_used, x_digits, m_used) > 0)) {
-        _absSub(d_digits, abcd_used, x_digits, m_used, d_digits);
-      }
-    }
-    return new _Bigint(false, m_used, d_digits)._toValidInt();
-  }
-
-  // Returns 1/this % m, with m > 0.
-  int modInverse(int m) {
-    if (m is! int) {
-      throw new ArgumentError.value(m, "modulus", "not an integer");
-    }
-    if (m <= 0) throw new RangeError.range(m, 1, null, "modulus");
-    if (m == 1) return 0;
-    final mAsBigint = m._toBigint();
-    int t = this;
-    if (this._neg || (this._absCompare(mAsBigint) >= 0)) {
-      t %= mAsBigint;
-      t = t._toBigint();
-    }
-    return _binaryGcd(mAsBigint, t, true);
-  }
-
-  // Returns gcd of abs(this) and abs(other).
-  int gcd(int other) {
-    if (other is! int) {
-      throw new ArgumentError.value(other, "other", "not an integer");
-    }
-    if (other == 0) {
-      return this.abs();
-    }
-    return _binaryGcd(this, other._toBigint(), false);
-  }
-}
-
-// Interface for modular reduction.
-abstract class _Reduction {
-  // Return the number of digits used by r_digits.
-  int _convert(_Bigint x, Uint32List r_digits);
-  int _mul(Uint32List x_digits, int x_used, Uint32List y_digits, int y_used,
-      Uint32List r_digits);
-  int _sqr(Uint32List x_digits, int x_used, Uint32List r_digits);
-
-  // Return x reverted to _Bigint.
-  _Bigint _revert(Uint32List x_digits, int x_used);
-}
-
-// Montgomery reduction on _Bigint.
-class _Montgomery implements _Reduction {
-  final _Bigint _m; // Modulus.
-  int _mused2p2;
-  Uint32List _args;
-  int _digits_per_step; // Number of digits processed in one step. 1 or 2.
-  static const int _X = 0; // Index of x.
-  static const int _X_HI = 1; // Index of high 32-bits of x (64-bit only).
-  static const int _RHO = 2; // Index of rho.
-  static const int _RHO_HI = 3; // Index of high 32-bits of rho (64-bit only).
-  static const int _MU = 4; // Index of mu.
-  static const int _MU_HI = 5; // Index of high 32-bits of mu (64-bit only).
-
-  _Montgomery(this._m) {
-    _mused2p2 = 2 * _m._used + 2;
-    _args = new Uint32List(6);
-    // Determine if we can process digit pairs by calling an intrinsic.
-    _digits_per_step = _mulMod(_args, _args, 0);
-    _args[_X] = _m._digits[0];
-    if (_digits_per_step == 1) {
-      _invDigit(_args);
-    } else {
-      assert(_digits_per_step == 2);
-      _args[_X_HI] = _m._digits[1];
-      _invDigitPair(_args);
-    }
-  }
-
-  // Calculates -1/x % _DIGIT_BASE, x is 32-bit digit.
-  //         xy == 1 (mod m)
-  //         xy =  1+km
-  //   xy(2-xy) = (1+km)(1-km)
-  // x(y(2-xy)) = 1-k^2 m^2
-  // x(y(2-xy)) == 1 (mod m^2)
-  // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2
-  // Should reduce x and y(2-xy) by m^2 at each step to keep size bounded.
-  //
-  // Operation:
-  //   args[_RHO] = 1/args[_X] mod _DIGIT_BASE.
-  static void _invDigit(Uint32List args) {
-    var x = args[_X];
-    var y = x & 3; // y == 1/x mod 2^2
-    y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4
-    y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8
-    y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16
-    // Last step - calculate inverse mod _DIGIT_BASE directly;
-    // Assumes 16 < _DIGIT_BITS <= 32 and assumes ability to handle 48-bit ints.
-    y = (y * (2 - x * y % _Bigint._DIGIT_BASE)) % _Bigint._DIGIT_BASE;
-    // y == 1/x mod _DIGIT_BASE
-    y = -y; // We really want the negative inverse.
-    args[_RHO] = y & _Bigint._DIGIT_MASK;
-    assert(((x * y) & _Bigint._DIGIT_MASK) == _Bigint._DIGIT_MASK);
-  }
-
-  // Calculates -1/x % _DIGIT_BASE^2, x is a pair of 32-bit digits.
-  // Operation:
-  //   args[_RHO.._RHO_HI] = 1/args[_X.._X_HI] mod _DIGIT_BASE^2.
-  static void _invDigitPair(Uint32List args) {
-    var xl = args[_X]; // Lower 32-bit digit of x.
-    var y = xl & 3; // y == 1/x mod 2^2
-    y = (y * (2 - (xl & 0xf) * y)) & 0xf; // y == 1/x mod 2^4
-    y = (y * (2 - (xl & 0xff) * y)) & 0xff; // y == 1/x mod 2^8
-    y = (y * (2 - (((xl & 0xffff) * y) & 0xffff))) &
-        0xffff; // y == 1/x mod 2^16
-    y = (y * (2 - ((xl * y) & 0xffffffff))) & 0xffffffff; // y == 1/x mod 2^32
-    // Warning: The following expressions involve bigint arithmetic.
-    var x = (args[_X_HI] << _Bigint._DIGIT_BITS) | xl;
-    y = (y * (2 - ((x * y) & _Bigint._TWO_DIGITS_MASK))) &
-        _Bigint._TWO_DIGITS_MASK;
-    // y == 1/x mod _DIGIT_BASE^2
-    y = -y; // We really want the negative inverse.
-    args[_RHO] = y & _Bigint._DIGIT_MASK;
-    args[_RHO_HI] = (y >> _Bigint._DIGIT_BITS) & _Bigint._DIGIT_MASK;
-    assert(((x * y) & _Bigint._TWO_DIGITS_MASK) == _Bigint._TWO_DIGITS_MASK);
-  }
-
-  // Operation:
-  //   args[_MU] = args[_RHO]*digits[i] mod _DIGIT_BASE.
-  //   return 1.
-  // Note: Intrinsics on 64-bit platforms process digit pairs at even indices:
-  //   args[_MU.._MU_HI] = args[_RHO.._RHO_HI]*digits[i..i+1] mod _DIGIT_BASE^2.
-  //   return 2.
-  static int _mulMod(Uint32List args, Uint32List digits, int i) {
-    // Verify that digit pairs are accessible for 64-bit processing.
-    assert(digits.length > (i | 1));
-    const int MU_MASK = (1 << (_Bigint._DIGIT_BITS - _Bigint._DIGIT2_BITS)) - 1;
-    var rhol = args[_RHO] & _Bigint._DIGIT2_MASK;
-    var rhoh = args[_RHO] >> _Bigint._DIGIT2_BITS;
-    var dh = digits[i] >> _Bigint._DIGIT2_BITS;
-    var dl = digits[i] & _Bigint._DIGIT2_MASK;
-    args[_MU] = (dl * rhol +
-            (((dl * rhoh + dh * rhol) & MU_MASK) << _Bigint._DIGIT2_BITS)) &
-        _Bigint._DIGIT_MASK;
-    return 1;
-  }
-
-  // r = x*R mod _m.
-  // Return r_used.
-  int _convert(_Bigint x, Uint32List r_digits) {
-    // Montgomery reduction only works if abs(x) < _m.
-    assert(x._abs() < _m);
-    assert(_digits_per_step == 1 || _m._used.isEven);
-    var r = x._abs()._dlShift(_m._used)._rem(_m);
-    if (x._neg && !r._neg && r._used > 0) {
-      r = _m._sub(r);
-    }
-    var used = r._used;
-    var digits = r._digits;
-    var i = used + (used & 1);
-    while (--i >= 0) {
-      r_digits[i] = digits[i];
-    }
-    return used;
-  }
-
-  _Bigint _revert(Uint32List x_digits, int x_used) {
-    var r_digits = new Uint32List(_mused2p2);
-    var i = x_used + (x_used & 1);
-    while (--i >= 0) {
-      r_digits[i] = x_digits[i];
-    }
-    var r_used = _reduce(r_digits, x_used);
-    return new _Bigint(false, r_used, r_digits);
-  }
-
-  // x = x/R mod _m.
-  // Return x_used.
-  int _reduce(Uint32List x_digits, int x_used) {
-    while (x_used < _mused2p2) {
-      // Pad x so _mulAdd has enough room later.
-      x_digits[x_used++] = 0;
-    }
-    var m_used = _m._used;
-    var m_digits = _m._digits;
-    var i = 0;
-    while (i < m_used) {
-      var d = _mulMod(_args, x_digits, i);
-      assert(d == _digits_per_step);
-      d = _Bigint._mulAdd(_args, _MU, m_digits, 0, x_digits, i, m_used);
-      assert(d == _digits_per_step);
-      i += d;
-    }
-    // Clamp x.
-    while (x_used > 0 && x_digits[x_used - 1] == 0) {
-      --x_used;
-    }
-    // Shift right by m_used digits or, if processing pairs, by i (even) digits.
-    x_used = _Bigint._drShiftDigits(x_digits, x_used, i, x_digits);
-    if (_Bigint._compareDigits(x_digits, x_used, m_digits, m_used) >= 0) {
-      _Bigint._absSub(x_digits, x_used, m_digits, m_used, x_digits);
-    }
-    // Clamp x.
-    while (x_used > 0 && x_digits[x_used - 1] == 0) {
-      --x_used;
-    }
-    return x_used;
-  }
-
-  int _sqr(Uint32List x_digits, int x_used, Uint32List r_digits) {
-    var r_used = _Bigint._sqrDigits(x_digits, x_used, r_digits);
-    return _reduce(r_digits, r_used);
-  }
-
-  int _mul(Uint32List x_digits, int x_used, Uint32List y_digits, int y_used,
-      Uint32List r_digits) {
-    var r_used =
-        _Bigint._mulDigits(x_digits, x_used, y_digits, y_used, r_digits);
-    return _reduce(r_digits, r_used);
-  }
-}
-
-// Modular reduction using "classic" algorithm.
-class _Classic implements _Reduction {
-  final _Bigint _m; // Modulus.
-  _Bigint _norm_m; // Normalized _m.
-  Uint32List _neg_norm_m_digits; // Negated _norm_m digits.
-  int _m_nsh; // Normalization shift amount.
-  Uint32List _mt_qd; // Top _norm_m digit(s) and place holder for
-  // estimated quotient digit(s).
-  Uint32List _t_digits; // Temporary digits used during reduction.
-
-  _Classic(this._m) {
-    // Preprocess arguments to _remDigits.
-    var nsh = _Bigint._DIGIT_BITS - _Bigint._nbits(_m._digits[_m._used - 1]);
-    // For 64-bit processing, make sure _norm_m_digits has an even number of
-    // digits.
-    if (_m._used.isOdd) {
-      nsh += _Bigint._DIGIT_BITS;
-    }
-    _m_nsh = nsh;
-    _norm_m = _m._lShift(nsh);
-    var nm_used = _norm_m._used;
-    assert(nm_used.isEven);
-    _mt_qd = new Uint32List(4);
-    _mt_qd[_Bigint._YT_LO] = _norm_m._digits[nm_used - 2];
-    _mt_qd[_Bigint._YT] = _norm_m._digits[nm_used - 1];
-    // Negate _norm_m so we can use _mulAdd instead of unimplemented _mulSub.
-    var neg_norm_m = _Bigint._ONE._dlShift(nm_used)._sub(_norm_m);
-    if (neg_norm_m._used < nm_used) {
-      _neg_norm_m_digits =
-          _Bigint._cloneDigits(neg_norm_m._digits, 0, nm_used, nm_used);
-    } else {
-      _neg_norm_m_digits = neg_norm_m._digits;
-    }
-    // _neg_norm_m_digits is read-only and has nm_used digits (possibly
-    // including several leading zeros) plus a leading zero for 64-bit
-    // processing.
-    _t_digits = new Uint32List(2 * nm_used);
-  }
-
-  int _convert(_Bigint x, Uint32List r_digits) {
-    var digits;
-    var used;
-    if (x._neg || x._compare(_m) >= 0) {
-      var r = x._rem(_m);
-      if (x._neg && !r._neg && r._used > 0) {
-        r = _m._sub(r);
-      }
-      assert(!r._neg);
-      used = r._used;
-      digits = r._digits;
-    } else {
-      used = x._used;
-      digits = x._digits;
-    }
-    var i = used + (used & 1); // Copy leading zero if any.
-    while (--i >= 0) {
-      r_digits[i] = digits[i];
-    }
-    return used;
-  }
-
-  _Bigint _revert(Uint32List x_digits, int x_used) {
-    return new _Bigint(false, x_used, x_digits);
-  }
-
-  int _reduce(Uint32List x_digits, int x_used) {
-    if (x_used < _m._used) {
-      return x_used;
-    }
-    // The function _remDigits(...) is optimized for reduction and equivalent to
-    // calling _convert(_revert(x_digits, x_used)._rem(_m), x_digits);
-    return _Bigint._remDigits(x_digits, x_used, _norm_m._digits, _norm_m._used,
-        _neg_norm_m_digits, _m_nsh, _mt_qd, _t_digits, x_digits);
-  }
-
-  int _sqr(Uint32List x_digits, int x_used, Uint32List r_digits) {
-    var r_used = _Bigint._sqrDigits(x_digits, x_used, r_digits);
-    return _reduce(r_digits, r_used);
-  }
-
-  int _mul(Uint32List x_digits, int x_used, Uint32List y_digits, int y_used,
-      Uint32List r_digits) {
-    var r_used =
-        _Bigint._mulDigits(x_digits, x_used, y_digits, y_used, r_digits);
-    return _reduce(r_digits, r_used);
-  }
-}
diff --git a/runtime/lib/class_id_fasta.dart b/runtime/lib/class_id_fasta.dart
index b7a6e54..150488e 100644
--- a/runtime/lib/class_id_fasta.dart
+++ b/runtime/lib/class_id_fasta.dart
@@ -13,5 +13,4 @@
   static final int cidImmutableArray = 0;
   static final int cidOneByteString = 0;
   static final int cidTwoByteString = 0;
-  static final int cidBigint = 0;
 }
diff --git a/runtime/lib/core_patch.dart b/runtime/lib/core_patch.dart
index 3bbb755..1b0f849 100644
--- a/runtime/lib/core_patch.dart
+++ b/runtime/lib/core_patch.dart
@@ -53,7 +53,6 @@
 /// These are the additional parts of this patch library:
 // part "array.dart";
 // part "array_patch.dart";
-// part "bigint.dart";
 // part "bigint_patch.dart";
 // part "bool_patch.dart";
 // part "date_patch.dart";
@@ -92,7 +91,6 @@
   num _remainderFromInteger(int other);
   bool _greaterThanFromInteger(int other);
   bool _equalToInteger(int other);
-  num _toBigintOrDouble();
 }
 
 // The members of this class are cloned and added to each class that
diff --git a/runtime/lib/core_sources.gni b/runtime/lib/core_sources.gni
index dc4f7c8..2f9a7a9 100644
--- a/runtime/lib/core_sources.gni
+++ b/runtime/lib/core_sources.gni
@@ -10,7 +10,6 @@
   "array.cc",
   "array.dart",
   "array_patch.dart",
-  "bigint.dart",
   "bigint_patch.dart",
   "bool.cc",
   "bool_patch.dart",
diff --git a/runtime/lib/double.cc b/runtime/lib/double.cc
index 9787af0..4fc5baa 100644
--- a/runtime/lib/double.cc
+++ b/runtime/lib/double.cc
@@ -74,46 +74,15 @@
     args.SetAt(0, String::Handle(String::New(error_msg)));
     Exceptions::ThrowByType(Exceptions::kUnsupported, args);
   }
-  if (FLAG_limit_ints_to_64_bits) {
-    int64_t ival = 0;
-    if (val <= static_cast<double>(kMinInt64)) {
-      ival = kMinInt64;
-    } else if (val >= static_cast<double>(kMaxInt64)) {
-      ival = kMaxInt64;
-    } else {  // Representable in int64_t.
-      ival = static_cast<int64_t>(val);
-    }
-    return Integer::New(ival);
+  int64_t ival = 0;
+  if (val <= static_cast<double>(kMinInt64)) {
+    ival = kMinInt64;
+  } else if (val >= static_cast<double>(kMaxInt64)) {
+    ival = kMaxInt64;
+  } else {  // Representable in int64_t.
+    ival = static_cast<int64_t>(val);
   }
-  if ((-1.0 < val) && (val < 1.0)) {
-    return Smi::New(0);
-  }
-  DoubleInternals internals = DoubleInternals(val);
-  ASSERT(!internals.IsSpecial());  // Only Infinity and NaN are special.
-  uint64_t significand = internals.Significand();
-  intptr_t exponent = internals.Exponent();
-  if (exponent <= 0) {
-    significand >>= -exponent;
-    exponent = 0;
-  } else if (exponent <= 10) {
-    // A double significand has at most 53 bits. The following shift will
-    // hence not overflow, and yield an integer of at most 63 bits.
-    significand <<= exponent;
-    exponent = 0;
-  }
-  // A significand has at most 63 bits (after the shift above).
-  // The cast to int64_t is hence safe.
-  int64_t ival = static_cast<int64_t>(significand);
-  if (internals.Sign() < 0) {
-    ival = -ival;
-  }
-  if (exponent == 0) {
-    // The double fits in a Smi or Mint.
-    return Integer::New(ival);
-  }
-  Integer& result = Integer::Handle();
-  result = Bigint::NewFromShiftedInt64(ival, exponent);
-  return result.AsValidInteger();
+  return Integer::New(ival);
 }
 
 DEFINE_NATIVE_ENTRY(Double_hashCode, 1) {
@@ -127,14 +96,6 @@
     if (static_cast<double>(ival) == val) {
       return Integer::New(ival);
     }
-  } else if (!FLAG_limit_ints_to_64_bits && !isinf(val) && !isnan(val)) {
-    // Since this code is temporary until we limit ints to 64 bits, we
-    // reuse the existing DoubleToInteger helper function and pass it
-    // an empty error message ("") because it cannot fail.
-    const Integer& bigint = Integer::Handle(DoubleToInteger(val, ""));
-    if (bigint.AsDoubleValue() == val) {
-      return bigint.raw();
-    }
   }
 
   uint64_t uval = bit_cast<uint64_t>(val);
diff --git a/runtime/lib/double.dart b/runtime/lib/double.dart
index 86ad7ca..151bf24 100644
--- a/runtime/lib/double.dart
+++ b/runtime/lib/double.dart
@@ -149,9 +149,6 @@
   }
 
   int toInt() native "Double_toInt";
-  num _toBigintOrDouble() {
-    return this;
-  }
 
   double toDouble() {
     return this;
diff --git a/runtime/lib/integers.cc b/runtime/lib/integers.cc
index 5443197..4b93733 100644
--- a/runtime/lib/integers.cc
+++ b/runtime/lib/integers.cc
@@ -23,14 +23,9 @@
 
 // Smi natives.
 
-// Returns false if integer is in wrong representation, e.g., as is a Bigint
+// Returns false if integer is in wrong representation, e.g., as is a Mint
 // when it could have been a Smi.
 static bool CheckInteger(const Integer& i) {
-  if (i.IsBigint()) {
-    ASSERT(!Bigint::IsDisabled());
-    const Bigint& bigint = Bigint::Cast(i);
-    return !bigint.FitsIntoSmi() && !bigint.FitsIntoInt64();
-  }
   if (i.IsMint()) {
     const Mint& mint = Mint::Cast(i);
     return !Smi::IsValid(mint.value());
@@ -245,35 +240,20 @@
     const Smi& smi_value = Smi::Cast(value);
     return smi_value.ShiftOp(kind, amount, Heap::kNew);
   }
-  if (value.IsMint()) {
-    const int64_t mint_value = value.AsInt64Value();
-    intptr_t shift_count = amount.Value();
-    switch (kind) {
-      case Token::kSHL:
-        if (FLAG_limit_ints_to_64_bits) {
-          return Integer::New(
-              Utils::ShiftLeftWithTruncation(mint_value, shift_count),
-              Heap::kNew);
-        } else {
-          const int count = Utils::HighestBit(mint_value);
-          if (shift_count < (Mint::kBits - count)) {
-            return Integer::New(mint_value << shift_count, Heap::kNew);
-          } else {
-            // Overflow in shift, use Bigints
-            return Integer::null();
-          }
-        }
-      case Token::kSHR:
-        shift_count = Utils::Minimum(shift_count, Mint::kBits);
-        return Integer::New(mint_value >> shift_count, Heap::kNew);
-      default:
-        UNIMPLEMENTED();
-    }
-  } else {
-    ASSERT(value.IsBigint());
+  ASSERT(value.IsMint());
+  const int64_t mint_value = value.AsInt64Value();
+  intptr_t shift_count = amount.Value();
+  switch (kind) {
+    case Token::kSHL:
+      return Integer::New(
+          Utils::ShiftLeftWithTruncation(mint_value, shift_count), Heap::kNew);
+    case Token::kSHR:
+      shift_count = Utils::Minimum(shift_count, Mint::kBits);
+      return Integer::New(mint_value >> shift_count, Heap::kNew);
+    default:
+      UNIMPLEMENTED();
+      return Integer::null();
   }
-  ASSERT(!Bigint::IsDisabled());
-  return Integer::null();
 }
 
 DEFINE_NATIVE_ENTRY(Smi_bitAndFromSmi, 2) {
@@ -369,31 +349,4 @@
   return 0;
 }
 
-// Bigint natives.
-
-DEFINE_NATIVE_ENTRY(Bigint_getNeg, 1) {
-  const Bigint& bigint = Bigint::CheckedHandle(arguments->NativeArgAt(0));
-  return bigint.neg();
-}
-
-DEFINE_NATIVE_ENTRY(Bigint_getUsed, 1) {
-  const Bigint& bigint = Bigint::CheckedHandle(arguments->NativeArgAt(0));
-  return bigint.used();
-}
-
-DEFINE_NATIVE_ENTRY(Bigint_getDigits, 1) {
-  const Bigint& bigint = Bigint::CheckedHandle(arguments->NativeArgAt(0));
-  return bigint.digits();
-}
-
-DEFINE_NATIVE_ENTRY(Bigint_allocate, 4) {
-  ASSERT(!Bigint::IsDisabled());
-  // First arg is null type arguments, since class Bigint is not parameterized.
-  const Bool& neg = Bool::CheckedHandle(arguments->NativeArgAt(1));
-  const Smi& used = Smi::CheckedHandle(arguments->NativeArgAt(2));
-  const TypedData& digits = TypedData::CheckedHandle(arguments->NativeArgAt(3));
-  ASSERT(!digits.IsNull());
-  return Bigint::New(neg.value(), used.Value(), digits);
-}
-
 }  // namespace dart
diff --git a/runtime/lib/integers.dart b/runtime/lib/integers.dart
index d779bc7..fe33e66 100644
--- a/runtime/lib/integers.dart
+++ b/runtime/lib/integers.dart
@@ -9,35 +9,15 @@
 abstract class _int64 implements int {}
 
 abstract class _IntegerImplementation implements int {
-  num operator +(num other) {
-    var result = other._addFromInteger(this);
-    if (result != null) return result;
-    final _IntegerImplementation otherAsIntImpl = other;
-    return otherAsIntImpl._toBigint()._addFromInteger(this);
-  }
-
-  num operator -(num other) {
-    var result = other._subFromInteger(this);
-    if (result != null) return result;
-    final _IntegerImplementation otherAsIntImpl = other;
-    return otherAsIntImpl._toBigint()._subFromInteger(this);
-  }
-
-  num operator *(num other) {
-    var result = other._mulFromInteger(this);
-    if (result != null) return result;
-    final _IntegerImplementation otherAsIntImpl = other;
-    return otherAsIntImpl._toBigint()._mulFromInteger(this);
-  }
+  num operator +(num other) => other._addFromInteger(this);
+  num operator -(num other) => other._subFromInteger(this);
+  num operator *(num other) => other._mulFromInteger(this);
 
   int operator ~/(num other) {
     if ((other is int) && (other == 0)) {
       throw const IntegerDivisionByZeroException();
     }
-    var result = other._truncDivFromInteger(this);
-    if (result != null) return result;
-    final _IntegerImplementation otherAsIntImpl = other;
-    return otherAsIntImpl._toBigint()._truncDivFromInteger(this);
+    return other._truncDivFromInteger(this);
   }
 
   double operator /(num other) {
@@ -48,33 +28,16 @@
     if ((other is int) && (other == 0)) {
       throw const IntegerDivisionByZeroException();
     }
-    var result = other._moduloFromInteger(this);
-    if (result != null) return result;
-    final _IntegerImplementation otherAsIntImpl = other;
-    return otherAsIntImpl._toBigint()._moduloFromInteger(this);
+    return other._moduloFromInteger(this);
   }
 
   int operator -() {
     return 0 - this;
   }
 
-  int operator &(int other) {
-    var result = other._bitAndFromInteger(this);
-    if (result != null) return result;
-    return other._toBigint()._bitAndFromInteger(this);
-  }
-
-  int operator |(int other) {
-    var result = other._bitOrFromInteger(this);
-    if (result != null) return result;
-    return other._toBigint()._bitOrFromInteger(this);
-  }
-
-  int operator ^(int other) {
-    var result = other._bitXorFromInteger(this);
-    if (result != null) return result;
-    return other._toBigint()._bitXorFromInteger(this);
-  }
+  int operator &(int other) => other._bitAndFromInteger(this);
+  int operator |(int other) => other._bitOrFromInteger(this);
+  int operator ^(int other) => other._bitXorFromInteger(this);
 
   num remainder(num other) {
     return other._remainderFromInteger(this);
@@ -93,17 +56,8 @@
     return other - (other ~/ this) * this;
   }
 
-  int operator >>(int other) {
-    var result = other._shrFromInt(this);
-    if (result != null) return result;
-    return other._toBigint()._shrFromInt(this);
-  }
-
-  int operator <<(int other) {
-    var result = other._shlFromInt(this);
-    if (result != null) return result;
-    return other._toBigint()._shlFromInt(this);
-  }
+  int operator >>(int other) => other._shrFromInt(this);
+  int operator <<(int other) => other._shlFromInt(this);
 
   bool operator <(num other) {
     return other > this;
@@ -272,14 +226,6 @@
     return new _Double.fromInteger(this);
   }
 
-  _Bigint _toBigint() {
-    return new _Bigint._fromInt(this);
-  }
-
-  num _toBigintOrDouble() {
-    return _toBigint();
-  }
-
   String toStringAsFixed(int fractionDigits) {
     return this.toDouble().toStringAsFixed(fractionDigits);
   }
@@ -386,9 +332,6 @@
     if (e < 0) throw new RangeError.range(e, 0, null, "exponent");
     if (m <= 0) throw new RangeError.range(m, 1, null, "modulus");
     if (e == 0) return 1;
-    if (e is _Bigint || m is _Bigint) {
-      return _toBigint().modPow(e, m);
-    }
     int b = this;
     if (b < 0 || b > m) {
       b %= m;
@@ -483,9 +426,6 @@
     }
     if (m <= 0) throw new RangeError.range(m, 1, null, "modulus");
     if (m == 1) return 0;
-    if (m is _Bigint) {
-      return _toBigint().modInverse(m);
-    }
     int t = this;
     if ((t < 0) || (t >= m)) t %= m;
     if (t == 1) return 1;
@@ -505,9 +445,6 @@
     if (x == 0) return y;
     if (y == 0) return x;
     if ((x == 1) || (y == 1)) return 1;
-    if (y is _Bigint) {
-      return x._toBigint().gcd(y);
-    }
     return _binaryGcd(x, y, false);
   }
 }
diff --git a/runtime/lib/integers_patch.dart b/runtime/lib/integers_patch.dart
index d1c13be..9d2f62d 100644
--- a/runtime/lib/integers_patch.dart
+++ b/runtime/lib/integers_patch.dart
@@ -11,7 +11,6 @@
   const factory int.fromEnvironment(String name, {int defaultValue})
       native "Integer_fromEnvironment";
 
-  _Bigint _toBigint();
   int _shrFromInt(int other);
   int _shlFromInt(int other);
   int _bitAndFromSmi(_Smi other);
@@ -158,41 +157,36 @@
     int multiplier = _PARSE_LIMITS[tableIndex + 1];
     int positiveOverflowLimit = 0;
     int negativeOverflowLimit = 0;
-    if (_limitIntsTo64Bits) {
-      tableIndex = tableIndex << 1; // pre-multiply by 2 for simpler indexing
-      positiveOverflowLimit = _int64OverflowLimits[tableIndex];
-      if (positiveOverflowLimit == 0) {
-        positiveOverflowLimit =
-            _initInt64OverflowLimits(tableIndex, multiplier);
-      }
-      negativeOverflowLimit = _int64OverflowLimits[tableIndex + 1];
+    tableIndex = tableIndex << 1; // pre-multiply by 2 for simpler indexing
+    positiveOverflowLimit = _int64OverflowLimits[tableIndex];
+    if (positiveOverflowLimit == 0) {
+      positiveOverflowLimit = _initInt64OverflowLimits(tableIndex, multiplier);
     }
+    negativeOverflowLimit = _int64OverflowLimits[tableIndex + 1];
     int blockEnd = start + blockSize;
     do {
       _Smi smi = _parseBlock(source, radix, start, blockEnd);
       if (smi == null) return null;
-      if (_limitIntsTo64Bits) {
-        if (result >= positiveOverflowLimit) {
-          if ((result > positiveOverflowLimit) ||
-              (smi > _int64OverflowLimits[tableIndex + 2])) {
-            // Although the unsigned overflow limits do not depend on the
-            // platform, the multiplier and block size, which are used to
-            // compute it, do.
-            int X = is64Bit ? 1 : 0;
-            if (radix == 16 &&
-                !(result >= _int64UnsignedOverflowLimits[X] &&
-                    (result > _int64UnsignedOverflowLimits[X] ||
-                        smi > _int64UnsignedSmiOverflowLimits[X])) &&
-                blockEnd + blockSize > end) {
-              return (result * multiplier) + smi;
-            }
-            return null;
+      if (result >= positiveOverflowLimit) {
+        if ((result > positiveOverflowLimit) ||
+            (smi > _int64OverflowLimits[tableIndex + 2])) {
+          // Although the unsigned overflow limits do not depend on the
+          // platform, the multiplier and block size, which are used to
+          // compute it, do.
+          int X = is64Bit ? 1 : 0;
+          if (radix == 16 &&
+              !(result >= _int64UnsignedOverflowLimits[X] &&
+                  (result > _int64UnsignedOverflowLimits[X] ||
+                      smi > _int64UnsignedSmiOverflowLimits[X])) &&
+              blockEnd + blockSize > end) {
+            return (result * multiplier) + smi;
           }
-        } else if (result <= negativeOverflowLimit) {
-          if ((result < negativeOverflowLimit) ||
-              (smi > _int64OverflowLimits[tableIndex + 3])) {
-            return null;
-          }
+          return null;
+        }
+      } else if (result <= negativeOverflowLimit) {
+        if ((result < negativeOverflowLimit) ||
+            (smi > _int64OverflowLimits[tableIndex + 3])) {
+          return null;
         }
       }
       result = (result * multiplier) + (sign * smi);
@@ -266,12 +260,8 @@
     5, 60466176, 11, 131621703842267136,
   ];
 
-  /// Flag indicating if integers are limited by 64 bits
-  /// (`--limit-ints-to-64-bits` mode is enabled).
-  static const _limitIntsTo64Bits = ((1 << 64) == 0);
-
   static const _maxInt64 = 0x7fffffffffffffff;
-  static const _minInt64 = -_maxInt64 - 1;
+  static const _minInt64 = -0x8000000000000000;
 
   static const _int64UnsignedOverflowLimits = const [0xfffffffff, 0xf];
   static const _int64UnsignedSmiOverflowLimits = const [
@@ -279,7 +269,7 @@
     0xfffffffffffffff
   ];
 
-  /// In the `--limit-ints-to-64-bits` mode calculation of the expression
+  /// Calculation of the expression
   ///
   ///   result = (result * multiplier) + (sign * smi)
   ///
diff --git a/runtime/lib/math.cc b/runtime/lib/math.cc
index 6ca9793..6b6ac56 100644
--- a/runtime/lib/math.cc
+++ b/runtime/lib/math.cc
@@ -146,39 +146,7 @@
 //   return result;
 DEFINE_NATIVE_ENTRY(Random_setupSeed, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, seed_int, arguments->NativeArgAt(0));
-  uint64_t seed = 0;
-  if (seed_int.IsBigint()) {
-    Bigint& big_seed = Bigint::Handle();
-    big_seed ^= seed_int.raw();
-    uint64_t negate_mask = 0;
-    uint64_t borrow = 0;
-    if (big_seed.IsNegative()) {
-      // Negate bits to make seed positive.
-      // Negate bits again (by xor with negate_mask) when extracted below,
-      // to get original bits.
-      negate_mask = 0xffffffffffffffffLL;
-
-      // Instead of computing ~big_seed here, we compute it on the fly below as
-      // follows: ~(-big_seed) == ~(~(big_seed-1)) == big_seed-1
-      borrow = 1;
-    }
-    const intptr_t used = big_seed.Used();
-    intptr_t digit = 0;
-    do {
-      uint64_t low64 = ((digit + 1) < used) ? big_seed.DigitAt(digit + 1) : 0;
-      low64 <<= 32;
-      low64 |= (digit < used) ? big_seed.DigitAt(digit) : 0;
-      low64 -= borrow;
-      if ((borrow == 1) && (low64 != 0xffffffffffffffffLL)) {
-        borrow = 0;
-      }
-      low64 ^= negate_mask;
-      seed = (seed * 1037) ^ mix64(low64);
-      digit += 2;
-    } while (digit < used);
-  } else {
-    seed = mix64(static_cast<uint64_t>(seed_int.AsInt64Value()));
-  }
+  uint64_t seed = mix64(static_cast<uint64_t>(seed_int.AsInt64Value()));
 
   if (seed == 0) {
     seed = 0x5a17;
diff --git a/runtime/lib/math_patch.dart b/runtime/lib/math_patch.dart
index 8888042..ad400a4 100644
--- a/runtime/lib/math_patch.dart
+++ b/runtime/lib/math_patch.dart
@@ -116,7 +116,7 @@
       result *= base;
     }
     exponent >>= 1;
-    // Skip unnecessary operation (can overflow to Mint or Bigint).
+    // Skip unnecessary operation (can overflow to Mint).
     if (exponent != 0) {
       base *= base;
     }
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index 639d6d8..902e7ff 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -793,7 +793,8 @@
   List<ParameterMirror> _parameters;
   List<ParameterMirror> get parameters {
     if (_parameters == null) {
-      _parameters = _FunctionTypeMirror_parameters(_functionReflectee);
+      _parameters = _FunctionTypeMirror_parameters(_functionReflectee)
+          .cast<ParameterMirror>();
       _parameters = new UnmodifiableListView<ParameterMirror>(_parameters);
     }
     return _parameters;
diff --git a/runtime/lib/typed_data_patch.dart b/runtime/lib/typed_data_patch.dart
index b868a2d..b3aaf23 100644
--- a/runtime/lib/typed_data_patch.dart
+++ b/runtime/lib/typed_data_patch.dart
@@ -2501,7 +2501,7 @@
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
     }
-    _setIndexedInt64(index, _toInt64(value));
+    _setIndexedInt64(index, value);
   }
 
   // Method(s) implementing the TypedData interface.
@@ -2548,7 +2548,7 @@
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
     }
-    _setIndexedUint64(index, _toUint64(value));
+    _setIndexedUint64(index, value);
   }
 
   // Method(s) implementing the TypedData interface.
@@ -3066,7 +3066,7 @@
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
     }
-    _setIndexedInt64(index, _toInt64(value));
+    _setIndexedInt64(index, value);
   }
 
   // Method(s) implementing the TypedData interface.
@@ -3104,7 +3104,7 @@
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
     }
-    _setIndexedUint64(index, _toUint64(value));
+    _setIndexedUint64(index, value);
   }
 
   // Method(s) implementing the TypedData interface.
@@ -3867,7 +3867,7 @@
       throw new RangeError.index(index, this, "index");
     }
     _typedData._setInt64(
-        offsetInBytes + (index * Int64List.bytesPerElement), _toInt64(value));
+        offsetInBytes + (index * Int64List.bytesPerElement), value);
   }
 
   // Method(s) implementing TypedData interface.
@@ -3912,7 +3912,7 @@
       throw new RangeError.index(index, this, "index");
     }
     _typedData._setUint64(
-        offsetInBytes + (index * Uint64List.bytesPerElement), _toUint64(value));
+        offsetInBytes + (index * Uint64List.bytesPerElement), value);
   }
 
   // Method(s) implementing TypedData interface.
@@ -4444,25 +4444,6 @@
   return value & 0xFFFFFFFF;
 }
 
-// Note: in --limit-ints-to-64-bits mode all integers are 64-bit already.
-// Still, it is harmless to apply _uint64Mask because (1 << 64) is 0 (all bits
-// are shifted out), so _uint64Mask is -1 (its bit pattern is 0xffffffffffffffff).
-const _uint64Mask = (1 << 64) - 1;
-
-int _toInt64(int value) {
-  // Avoid bigint mask when possible.
-  return (ClassID.getID(value) == ClassID.cidBigint)
-      ? _toInt(value, _uint64Mask)
-      : value;
-}
-
-int _toUint64(int value) {
-  // Avoid bigint mask when possible.
-  return (ClassID.getID(value) == ClassID.cidBigint)
-      ? _toInt(value, _uint64Mask)
-      : value;
-}
-
 void _rangeCheck(int listLength, int start, int length) {
   if (length < 0) {
     throw new RangeError.value(length);
diff --git a/runtime/lib/vmservice.cc b/runtime/lib/vmservice.cc
index fce6e21..d5092c7 100644
--- a/runtime/lib/vmservice.cc
+++ b/runtime/lib/vmservice.cc
@@ -356,7 +356,9 @@
   delete[] data;
 }
 
-static void FilenameFinalizer(void* peer) {
+static void FilenameFinalizer(void* isolate_callback_data,
+                              Dart_WeakPersistentHandle handle,
+                              void* peer) {
   char* filename = reinterpret_cast<char*>(peer);
   delete[] filename;
 }
@@ -395,12 +397,13 @@
   intptr_t idx = 0;
   while (archive.HasMore()) {
     char* filename = archive.NextFilename();
+    intptr_t filename_length = strlen(filename);
     uint8_t* contents = archive.NextContent();
     intptr_t contents_length = archive.NextContentLength();
 
     Dart_Handle dart_filename = Dart_NewExternalLatin1String(
-        reinterpret_cast<uint8_t*>(filename), strlen(filename), filename,
-        FilenameFinalizer);
+        reinterpret_cast<uint8_t*>(filename), filename_length, filename,
+        filename_length, FilenameFinalizer);
     ASSERT(!Dart_IsError(dart_filename));
 
     Dart_Handle dart_contents = Dart_NewExternalTypedDataWithFinalizer(
diff --git a/runtime/observatory/BUILD.gn b/runtime/observatory/BUILD.gn
index 61ddc8f..af4db77 100644
--- a/runtime/observatory/BUILD.gn
+++ b/runtime/observatory/BUILD.gn
@@ -118,10 +118,42 @@
   compress = true
 }
 
+copy("copy_compressed_observatory_archive") {
+  archive_target = ":compressed_observatory_archive"
+  deps = [
+    archive_target,
+  ]
+  archive_dir = get_label_info(archive_target, "target_gen_dir")
+  archive_name = get_label_info(archive_target, "name")
+  archive_file = "${archive_dir}/${archive_name}.tar"
+  sources = [
+    archive_file,
+  ]
+  outputs = [
+    "$root_out_dir/${archive_name}.tar",
+  ]
+}
+
 observatory_archive("observatory_archive") {
   compress = false
 }
 
+copy("copy_observatory_archive") {
+  archive_target = ":observatory_archive"
+  deps = [
+    archive_target,
+  ]
+  archive_dir = get_label_info(archive_target, "target_gen_dir")
+  archive_name = get_label_info(archive_target, "name")
+  archive_file = "${archive_dir}/${archive_name}.tar"
+  sources = [
+    archive_file,
+  ]
+  outputs = [
+    "$root_out_dir/${archive_name}.tar",
+  ]
+}
+
 # Generates a .cc file containing the bytes of the observatory archive in a C
 # array.
 #
diff --git a/runtime/observatory/lib/src/debugger/debugger_location.dart b/runtime/observatory/lib/src/debugger/debugger_location.dart
index 9ba4bac..1904e43 100644
--- a/runtime/observatory/lib/src/debugger/debugger_location.dart
+++ b/runtime/observatory/lib/src/debugger/debugger_location.dart
@@ -75,8 +75,8 @@
     if (colStr != null) {
       colStr = colStr.substring(1);
     }
-    var line = int.parse(lineStr, onError: (_) => -1);
-    var col = (colStr != null ? int.parse(colStr, onError: (_) => -1) : null);
+    var line = int.tryParse(lineStr) ?? -1;
+    var col = (colStr != null ? int.tryParse(colStr) ?? -1 : null);
     if (line == -1) {
       return new Future.value(
           new DebuggerLocation.error("Line '${lineStr}' must be an integer"));
diff --git a/runtime/observatory/lib/src/elements/debugger.dart b/runtime/observatory/lib/src/elements/debugger.dart
index 5cc6896..5b15543 100644
--- a/runtime/observatory/lib/src/elements/debugger.dart
+++ b/runtime/observatory/lib/src/elements/debugger.dart
@@ -1008,7 +1008,7 @@
       return new Future.value(null);
     }
     var arg = args[0].trim();
-    var num = int.parse(arg, onError: (_) => null);
+    var num = int.tryParse(arg);
 
     var candidate;
     for (var isolate in debugger.vm.isolates) {
diff --git a/runtime/observatory/lib/src/elements/function_view.dart b/runtime/observatory/lib/src/elements/function_view.dart
index a829ded..93cc57c 100644
--- a/runtime/observatory/lib/src/elements/function_view.dart
+++ b/runtime/observatory/lib/src/elements/function_view.dart
@@ -58,7 +58,7 @@
   M.IsolateRef _isolate;
   M.EventRepository _events;
   M.NotificationRepository _notifications;
-  M.Function _function;
+  M.ServiceFunction _function;
   M.LibraryRef _library;
   M.FunctionRepository _functions;
   M.ClassRepository _classes;
@@ -72,12 +72,12 @@
   M.VMRef get vm => _vm;
   M.IsolateRef get isolate => _isolate;
   M.NotificationRepository get notifications => _notifications;
-  M.Function get function => _function;
+  M.ServiceFunction get function => _function;
 
   factory FunctionViewElement(
       M.VM vm,
       M.IsolateRef isolate,
-      M.Function function,
+      M.ServiceFunction function,
       M.EventRepository events,
       M.NotificationRepository notifications,
       M.FunctionRepository functions,
diff --git a/runtime/observatory/lib/src/elements/heap_map.dart b/runtime/observatory/lib/src/elements/heap_map.dart
index a5545d0..b2f7f81 100644
--- a/runtime/observatory/lib/src/elements/heap_map.dart
+++ b/runtime/observatory/lib/src/elements/heap_map.dart
@@ -223,9 +223,7 @@
     final address = _objectAt(event.offset).address.toRadixString(16);
     isolate.getObjectByAddress(address).then((result) {
       if (result.type != 'Sentinel') {
-        new AnchorElement(
-                href: Uris.inspect(_isolate, object: result as S.HeapObject))
-            .click();
+        new AnchorElement(href: Uris.inspect(_isolate, object: result)).click();
       }
     });
   }
diff --git a/runtime/observatory/lib/src/elements/isolate_view.dart b/runtime/observatory/lib/src/elements/isolate_view.dart
index edcc6e8..e199135 100644
--- a/runtime/observatory/lib/src/elements/isolate_view.dart
+++ b/runtime/observatory/lib/src/elements/isolate_view.dart
@@ -65,7 +65,7 @@
   M.LibraryRepository _libraries;
   M.ObjectRepository _objects;
   M.EvalRepository _eval;
-  M.Function _function;
+  M.ServiceFunction _function;
   M.ScriptRef _rootScript;
   StreamSubscription _subscription;
 
diff --git a/runtime/observatory/lib/src/elements/timeline_page.dart b/runtime/observatory/lib/src/elements/timeline_page.dart
index a751329..608a789 100644
--- a/runtime/observatory/lib/src/elements/timeline_page.dart
+++ b/runtime/observatory/lib/src/elements/timeline_page.dart
@@ -78,6 +78,9 @@
   IFrameElement _frame;
   DivElement _content;
 
+  bool get usingVMRecorder =>
+      _recorder.name != "Fuchsia" && _recorder.name != "Systrace";
+
   void render() {
     if (_frame == null) {
       _frame = new IFrameElement()..src = 'timeline.html';
@@ -125,44 +128,85 @@
                 ]
             ])
     ];
-    if (children.isEmpty) {
-      children = [
-        navBar([
-          new NavTopMenuElement(queue: _r.queue),
-          new NavVMMenuElement(vm, _events, queue: _r.queue),
-          navMenu('timeline', link: Uris.timeline()),
-          new NavRefreshElement(queue: _r.queue)
-            ..onRefresh.listen((e) async {
-              e.element.disabled = true;
-              await _refresh();
-              e.element.disabled = false;
-            }),
-          new NavRefreshElement(label: 'clear', queue: _r.queue)
-            ..onRefresh.listen((e) async {
-              e.element.disabled = true;
-              await _clear();
-              e.element.disabled = false;
-            }),
-          new NavRefreshElement(label: 'save', queue: _r.queue)
-            ..onRefresh.listen((e) async {
-              e.element.disabled = true;
-              await _save();
-              e.element.disabled = false;
-            }),
-          new NavRefreshElement(label: 'load', queue: _r.queue)
-            ..onRefresh.listen((e) async {
-              e.element.disabled = true;
-              await _load();
-              e.element.disabled = false;
-            }),
-          new NavNotifyElement(_notifications, queue: _r.queue)
-        ]),
-        _content,
-        new DivElement()
-          ..classes = ['iframe']
-          ..children = [_frame]
-      ];
+
+    children = [
+      navBar([
+        new NavTopMenuElement(queue: _r.queue),
+        new NavVMMenuElement(vm, _events, queue: _r.queue),
+        navMenu('timeline', link: Uris.timeline()),
+        new NavRefreshElement(queue: _r.queue)
+          ..onRefresh.listen((e) async {
+            e.element.disabled = true;
+            await _refresh();
+            e.element.disabled = !usingVMRecorder;
+          }),
+        new NavRefreshElement(label: 'clear', queue: _r.queue)
+          ..onRefresh.listen((e) async {
+            e.element.disabled = true;
+            await _clear();
+            e.element.disabled = !usingVMRecorder;
+          }),
+        new NavRefreshElement(label: 'save', queue: _r.queue)
+          ..onRefresh.listen((e) async {
+            e.element.disabled = true;
+            await _save();
+            e.element.disabled = !usingVMRecorder;
+          }),
+        new NavRefreshElement(label: 'load', queue: _r.queue)
+          ..onRefresh.listen((e) async {
+            e.element.disabled = true;
+            await _load();
+            e.element.disabled = !usingVMRecorder;
+          }),
+        new NavNotifyElement(_notifications, queue: _r.queue)
+      ]),
+      _content,
+      _createIFrameOrMessage(),
+    ];
+  }
+
+  HtmlElement _createIFrameOrMessage() {
+    if (_recorder == null) {
+      return new DivElement()
+        ..classes = ['content-centered-big']
+        ..text = 'Loading...';
     }
+
+    if (_recorder.name == "Fuchsia") {
+      return new DivElement()
+        ..classes = ['content-centered-big']
+        ..children = [
+          new BRElement(),
+          new SpanElement()
+            ..text =
+                "This VM is forwarding timeline events to Fuchsia's system tracing. See the ",
+          new AnchorElement()
+            ..text = "Fuchsia Tracing Usage Guide"
+            ..href =
+                "https://fuchsia.googlesource.com/garnet/+/master/docs/tracing_usage_guide.md",
+          new SpanElement()..text = ".",
+        ];
+    }
+
+    if (_recorder.name == "Systrace") {
+      return new DivElement()
+        ..classes = ['content-centered-big']
+        ..children = [
+          new BRElement(),
+          new SpanElement()
+            ..text =
+                "This VM is forwarding timeline events to Android's systrace. See the ",
+          new AnchorElement()
+            ..text = "systrace usage guide"
+            ..href =
+                "https://developer.android.com/studio/command-line/systrace",
+          new SpanElement()..text = ".",
+        ];
+    }
+
+    return new DivElement()
+      ..classes = ['iframe']
+      ..children = [_frame];
   }
 
   List<Element> _createProfileSelect() {
@@ -202,6 +246,9 @@
 
   Future _postMessage(String method,
       [Map<String, dynamic> params = const <String, dynamic>{}]) async {
+    if (_frame.contentWindow == null) {
+      return null;
+    }
     var message = {'method': method, 'params': params};
     _frame.contentWindow
         .postMessage(json.encode(message), window.location.href);
diff --git a/runtime/observatory/lib/src/models/objects/function.dart b/runtime/observatory/lib/src/models/objects/function.dart
index 0d4a997..904038d 100644
--- a/runtime/observatory/lib/src/models/objects/function.dart
+++ b/runtime/observatory/lib/src/models/objects/function.dart
@@ -75,7 +75,7 @@
   FunctionKind get kind;
 }
 
-abstract class Function extends Object implements FunctionRef {
+abstract class ServiceFunction extends Object implements FunctionRef {
   /// The location of this function in the source code. [optional]
   SourceLocation get location;
 
diff --git a/runtime/observatory/lib/src/models/repositories/function.dart b/runtime/observatory/lib/src/models/repositories/function.dart
index 38b7cc4..56298d7 100644
--- a/runtime/observatory/lib/src/models/repositories/function.dart
+++ b/runtime/observatory/lib/src/models/repositories/function.dart
@@ -5,5 +5,5 @@
 part of models;
 
 abstract class FunctionRepository {
-  Future<Function> get(IsolateRef isolate, String id);
+  Future<ServiceFunction> get(IsolateRef isolate, String id);
 }
diff --git a/runtime/observatory/lib/src/repositories/function.dart b/runtime/observatory/lib/src/repositories/function.dart
index 5906a2a..68527c5 100644
--- a/runtime/observatory/lib/src/repositories/function.dart
+++ b/runtime/observatory/lib/src/repositories/function.dart
@@ -5,7 +5,7 @@
 part of repositories;
 
 class FunctionRepository extends M.FunctionRepository {
-  Future<M.Function> get(M.IsolateRef i, String id) async {
+  Future<M.ServiceFunction> get(M.IsolateRef i, String id) async {
     S.Isolate isolate = i as S.Isolate;
     assert(isolate != null);
     return (await isolate.getObject(id)) as S.ServiceFunction;
diff --git a/runtime/observatory/lib/src/repositories/target.dart b/runtime/observatory/lib/src/repositories/target.dart
index 35d0dde..56c6246 100644
--- a/runtime/observatory/lib/src/repositories/target.dart
+++ b/runtime/observatory/lib/src/repositories/target.dart
@@ -117,7 +117,7 @@
     final Uri wsAddress = new Uri(
       scheme: 'ws',
       host: host ?? serverAddress.host,
-      port: int.parse(port ?? '', onError: (_) => serverAddress.port),
+      port: int.tryParse(port ?? '') ?? serverAddress.port,
       path: '/ws',
     );
     return wsAddress.toString();
diff --git a/runtime/observatory/lib/src/sample_profile/sample_profile.dart b/runtime/observatory/lib/src/sample_profile/sample_profile.dart
index e2f71e2..a06e5e7 100644
--- a/runtime/observatory/lib/src/sample_profile/sample_profile.dart
+++ b/runtime/observatory/lib/src/sample_profile/sample_profile.dart
@@ -236,8 +236,7 @@
 
   CallTreeNode _findInChildren(CallTreeNode current, CallTreeNode needle) {
     for (var child in current.children) {
-      if ((child as CallTreeNode).profileData ==
-          (needle as CallTreeNode).profileData) {
+      if ((child as CallTreeNode).profileData == needle.profileData) {
         return child;
       }
     }
@@ -332,8 +331,8 @@
             new FunctionCallTree(
                 tree.inclusive,
                 new FunctionCallTreeNode(
-                    (tree.root as CallTreeNode).profileData,
-                    (tree.root as CallTreeNode).count,
+                    tree.root.profileData,
+                    tree.root.count,
                     tree.root.inclusiveNativeAllocations,
                     tree.root.exclusiveNativeAllocations)));
 
@@ -444,7 +443,7 @@
 
   _markFunctionCalls() {
     for (var child in root.children) {
-      _markFunctionCallsInner(null, child as FunctionCallTreeNode);
+      _markFunctionCallsInner(null, child);
     }
   }
 }
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index 58503e1..ace655c 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -46,6 +46,9 @@
   static const kIsolateIsReloading = 108;
   static const kIsolateReloadBarred = 109;
   static const kIsolateMustHaveReloaded = 110;
+  static const kServiceAlreadyRegistered = 111;
+  static const kServiceDisappeared = 112;
+  static const kExpressionCompilationError = 113;
 
   static const kFileSystemAlreadyExists = 1001;
   static const kFileSystemDoesNotExist = 1002;
@@ -1624,7 +1627,7 @@
   void _update(Map map, bool mapIsRef) {
     name = map['name'];
     vmName = map.containsKey('_vmName') ? map['_vmName'] : name;
-    number = int.parse(map['number'], onError: (_) => null);
+    number = int.tryParse(map['number']);
     if (mapIsRef) {
       return;
     }
@@ -1632,7 +1635,7 @@
     loading = false;
     runnable = map['runnable'] == true;
     _upgradeCollection(map, isolate);
-    originNumber = int.parse(map['_originNumber'], onError: (_) => null);
+    originNumber = int.tryParse(map['_originNumber']);
     rootLibrary = map['rootLib'];
     if (map['entry'] != null) {
       entry = map['entry'];
@@ -1904,7 +1907,7 @@
   }
 
   Future<ServiceObject> evalFrame(int frameIndex, String expression,
-      {Map<String, ServiceObject> scope}) {
+      {Map<String, ServiceObject> scope}) async {
     Map params = {
       'frameIndex': frameIndex,
       'expression': expression,
@@ -1916,7 +1919,22 @@
       });
       params["scope"] = scopeWithIds;
     }
-    return invokeRpc('evaluateInFrame', params);
+
+    try {
+      return await invokeRpc('evaluateInFrame', params);
+    } on ServerRpcException catch (error) {
+      if (error.code == ServerRpcException.kExpressionCompilationError) {
+        Map map = {
+          'type': 'Error',
+          'message': error.data.toString(),
+          'kind': 'LanguageError',
+          'exception': null,
+          'stacktrace': null,
+        };
+        return new ServiceObject._fromMap(null, map);
+      } else
+        rethrow;
+    }
   }
 
   Future<ServiceObject> getReachableSize(ServiceObject target) {
@@ -2035,8 +2053,9 @@
 }
 
 /// A [ServiceObject] which implements [Map].
-class ServiceMap extends ServiceObject implements Map, M.UnknownObjectRef {
-  final Map _map = {};
+class ServiceMap extends ServiceObject
+    implements Map<String, dynamic>, M.UnknownObjectRef {
+  final Map<String, dynamic> _map = {};
   static String objectIdRingPrefix = 'objects/';
 
   bool get immutable => false;
@@ -2074,7 +2093,7 @@
   operator []=(k, v) => _map[k] = v;
   bool get isEmpty => _map.isEmpty;
   bool get isNotEmpty => _map.isNotEmpty;
-  Iterable get keys => _map.keys;
+  Iterable<String> get keys => _map.keys;
   Iterable get values => _map.values;
   int get length => _map.length;
 
@@ -3098,7 +3117,7 @@
   throw new FallThroughError();
 }
 
-class ServiceFunction extends HeapObject implements M.Function {
+class ServiceFunction extends HeapObject implements M.ServiceFunction {
   // owner is a Library, Class, or ServiceFunction.
   M.ObjectRef dartOwner;
   Library library;
@@ -3599,7 +3618,7 @@
     library = map['library'];
   }
 
-  void _parseTokenPosTable(List/*<List<int>>*/ table) {
+  void _parseTokenPosTable(List table) {
     if (table == null) {
       return;
     }
@@ -3609,14 +3628,14 @@
     lastTokenPos = null;
     var lineSet = new Set();
 
-    for (var line in table) {
+    for (List line in table) {
       // Each entry begins with a line number...
-      var lineNumber = line[0];
+      int lineNumber = line[0];
       lineSet.add(lineNumber);
       for (var pos = 1; pos < line.length; pos += 2) {
         // ...and is followed by (token offset, col number) pairs.
-        var tokenOffset = line[pos];
-        var colNumber = line[pos + 1];
+        int tokenOffset = line[pos];
+        int colNumber = line[pos + 1];
         if (firstTokenPos == null) {
           // Mark first token position.
           firstTokenPos = tokenOffset;
@@ -4409,7 +4428,7 @@
     }
   }
 
-  void _processDescriptors(List/*<Map>*/ descriptors) {
+  void _processDescriptors(List descriptors) {
     for (Map descriptor in descriptors) {
       var pcOffset = int.parse(descriptor['pcOffset'], radix: 16);
       var address = startAddress + pcOffset;
@@ -4569,7 +4588,7 @@
   String toString() => "ServiceMetric($_id)";
 }
 
-Future<Null> printFrames(List/*<Frame>*/ frames) async {
+Future<Null> printFrames(List frames) async {
   for (int i = 0; i < frames.length; i++) {
     final Frame frame = frames[i];
     String frameText = await frame.toUserString();
diff --git a/runtime/observatory/tests/observatory_ui/mocks/objects/function.dart b/runtime/observatory/tests/observatory_ui/mocks/objects/function.dart
index 7733e1d..bbe2c28 100644
--- a/runtime/observatory/tests/observatory_ui/mocks/objects/function.dart
+++ b/runtime/observatory/tests/observatory_ui/mocks/objects/function.dart
@@ -21,7 +21,7 @@
       this.kind});
 }
 
-class FunctionMock implements M.Function {
+class FunctionMock implements M.ServiceFunction {
   final String id;
   final String name;
   final M.ClassRef clazz;
diff --git a/runtime/observatory/tests/service/async_single_step_out_test.dart b/runtime/observatory/tests/service/async_single_step_out_test.dart
index 5f0777f..7da09fb 100644
--- a/runtime/observatory/tests/service/async_single_step_out_test.dart
+++ b/runtime/observatory/tests/service/async_single_step_out_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--error_on_bad_type --error_on_bad_override  --verbose_debug --async_debugger
+// VMOptions=--error_on_bad_type --error_on_bad_override  --verbose_debug --async_debugger --no-sync-async
 
 import 'dart:developer';
 import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/bad_reload_test.dart b/runtime/observatory/tests/service/bad_reload_test.dart
index 23927e9..660e683 100644
--- a/runtime/observatory/tests/service/bad_reload_test.dart
+++ b/runtime/observatory/tests/service/bad_reload_test.dart
@@ -66,9 +66,9 @@
     );
     // Observe that it failed.
     expect(response['success'], isFalse);
-    List/*<Map<String, dynamic>>*/ notices = response['details']['notices'];
+    List notices = response['details']['notices'];
     expect(notices.length, equals(1));
-    Map/*<String, dynamic>*/ reasonForCancelling = notices[0];
+    Map<String, dynamic> reasonForCancelling = notices[0];
     expect(reasonForCancelling['type'], equals('ReasonForCancelling'));
     expect(reasonForCancelling['message'], contains('library_isnt_here_man'));
 
diff --git a/runtime/observatory/tests/service/eval_internal_class_test.dart b/runtime/observatory/tests/service/eval_internal_class_test.dart
index 3027965..0e7beb1 100644
--- a/runtime/observatory/tests/service/eval_internal_class_test.dart
+++ b/runtime/observatory/tests/service/eval_internal_class_test.dart
@@ -15,14 +15,14 @@
     dynamic result = await classLibrary.evaluate('3 + 4');
     print(result);
     expect(result is DartError, isTrue);
-    expect(result.message, contains('Cannot evaluate'));
+    expect(result.message, contains('can be evaluated only'));
 
     Class classClass = await classLibrary.clazz.load();
     print(classClass);
     result = await classClass.evaluate('3 + 4');
     print(result);
     expect(result is DartError, isTrue);
-    expect(result.message, contains('Cannot evaluate'));
+    expect(result.message, contains('can be evaluated only'));
 
     Instance someArray = await root.evaluate("new List(2)");
     print(someArray);
diff --git a/runtime/observatory/tests/service/evaluate_in_frame_with_scope_test.dart b/runtime/observatory/tests/service/evaluate_in_frame_with_scope_test.dart
index bb8cd78..ade53db 100644
--- a/runtime/observatory/tests/service/evaluate_in_frame_with_scope_test.dart
+++ b/runtime/observatory/tests/service/evaluate_in_frame_with_scope_test.dart
@@ -45,21 +45,26 @@
     var thing2 = thing2Field.staticValue;
     print(thing2);
 
-    Instance result = await isolate.evalFrame(0, "x + y + a + b",
+    final isInstanceOf<Instance> isInstanceOfInstance =
+        new isInstanceOf<Instance>();
+    ServiceObject result = await isolate.evalFrame(0, "x + y + a + b",
         scope: <String, ServiceObject>{"a": thing1, "b": thing2});
+    expect(result, isInstanceOfInstance);
     print(result);
-    expect(result.valueAsString, equals('2033'));
+    expect((result as Instance).valueAsString, equals('2033'));
 
     result = await isolate.evalFrame(0, "local + a + b",
         scope: <String, ServiceObject>{"a": thing1, "b": thing2});
+    expect(result, isInstanceOfInstance);
     print(result);
-    expect(result.valueAsString, equals('2033'));
+    expect((result as Instance).valueAsString, equals('2033'));
 
     // Note the eval's scope is shadowing the locals' scope.
     result = await isolate.evalFrame(0, "x + y",
         scope: <String, ServiceObject>{"x": thing1, "y": thing2});
+    expect(result, isInstanceOfInstance);
     print(result);
-    expect(result.valueAsString, equals('7'));
+    expect((result as Instance).valueAsString, equals('7'));
 
     bool didThrow = false;
     try {
diff --git a/runtime/observatory/tests/service/external_service_disappear_test.dart b/runtime/observatory/tests/service/external_service_disappear_test.dart
index 9e9931e..7f39fad 100644
--- a/runtime/observatory/tests/service/external_service_disappear_test.dart
+++ b/runtime/observatory/tests/service/external_service_disappear_test.dart
@@ -32,7 +32,7 @@
     final client = _socket.map(_decoder).asBroadcastStream();
 
     // Note: keep this in sync with sdk/lib/vmservice.dart
-    const kServiceDisappeared = 111;
+    const kServiceDisappeared = 112;
     const kServiceDisappeared_Msg = 'Service has disappeared';
 
     const serviceName = 'disapearService';
diff --git a/runtime/observatory/tests/service/external_service_registration_test.dart b/runtime/observatory/tests/service/external_service_registration_test.dart
index 083c6d6..3b6cfa0 100644
--- a/runtime/observatory/tests/service/external_service_registration_test.dart
+++ b/runtime/observatory/tests/service/external_service_registration_test.dart
@@ -35,7 +35,7 @@
     final client = _socket.map(_decoder).asBroadcastStream();
 
     // Note: keep this in sync with sdk/lib/vmservice.dart
-    const kServiceAlreadyRegistered = 110;
+    const kServiceAlreadyRegistered = 111;
     const kServiceAlreadyRegistered_Msg = 'Service already registered';
 
     const serviceName = 'serviceName';
diff --git a/runtime/observatory/tests/service/external_service_registration_via_notification_test.dart b/runtime/observatory/tests/service/external_service_registration_via_notification_test.dart
index 11d478e..846f28b 100644
--- a/runtime/observatory/tests/service/external_service_registration_via_notification_test.dart
+++ b/runtime/observatory/tests/service/external_service_registration_via_notification_test.dart
@@ -35,7 +35,7 @@
     final client = _socket.map(_decoder).asBroadcastStream();
 
     // Note: keep this in sync with sdk/lib/vmservice.dart
-    const kServiceAlreadyRegistered = 110;
+    const kServiceAlreadyRegistered = 111;
     const kServiceAlreadyRegistered_Msg = 'Service already registered';
 
     const serviceName = 'serviceName';
diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart
index 3fb4084..e6aea8a 100644
--- a/runtime/observatory/tests/service/get_version_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_version_rpc_test.dart
@@ -13,7 +13,7 @@
     var result = await vm.invokeRpcNoUpgrade('getVersion', {});
     expect(result['type'], equals('Version'));
     expect(result['major'], equals(3));
-    expect(result['minor'], equals(8));
+    expect(result['minor'], equals(9));
     expect(result['_privateMajor'], equals(0));
     expect(result['_privateMinor'], equals(0));
   },
diff --git a/runtime/observatory/tests/service/service.status b/runtime/observatory/tests/service/service.status
index 8a40809..aa06e10 100644
--- a/runtime/observatory/tests/service/service.status
+++ b/runtime/observatory/tests/service/service.status
@@ -16,6 +16,8 @@
 process_service_test: Pass, Fail # Issue 24344
 
 [ $compiler == app_jit ]
+async_step_out_test: RuntimeError # Issue 29158, Async debugging
+awaiter_async_stack_contents_test: RuntimeError # Issue 29158, Async debugging
 bad_reload_test: RuntimeError # Issue 27806
 complex_reload_test: RuntimeError # Issue 27806
 debugger_location_second_test: Skip # Issue 28180
@@ -28,6 +30,8 @@
 next_through_for_each_loop_test: RuntimeError # Snapshots don't include source and generated source is not 1-to-1. The column offsets are thus off.
 next_through_implicit_call_test: RuntimeError # Snapshots don't include source and generated source is not 1-to-1. The column offsets are thus off.
 pause_on_unhandled_async_exceptions2_test: Pass, RuntimeError, Timeout, Crash # Issue 29178
+regress_28980_test: RuntimeError # Issue 29158, Async debugging
+set_library_debuggable_test: RuntimeError # Issue 29158, Async debugging
 set_name_rpc_test: RuntimeError # Issue 27806
 step_through_constructor_calls_test: RuntimeError # Snapshots don't include source and generated source is not 1-to-1. The column offsets are thus off.
 step_through_function_test: RuntimeError # Snapshots don't include source and generated source is not 1-to-1. The column offsets are thus off.
@@ -62,6 +66,9 @@
 dev_fs_http_put_weird_char_test: Skip # Windows disallows carriage returns in paths
 dev_fs_weird_char_test: Skip # Windows disallows question mark in paths
 
+[ $builder_tag == optimization_counter_threshold && $compiler != dartk ]
+pause_on_unhandled_async_exceptions_test: Pass, RuntimeError # Issue 33365
+
 [ $compiler == dart2analyzer && $strong ]
 *: Skip # Issue 28649
 
@@ -78,8 +85,12 @@
 *: Skip
 
 [ ($compiler == none || $compiler == precompiler) && ($runtime == dart_precompiled || $runtime == vm) ]
+async_step_out_test: RuntimeError # Issue 29158, Async debugging
+awaiter_async_stack_contents_test: RuntimeError # Issue 29158, Async debugging
 evaluate_activation_test/instance: RuntimeError # http://dartbug.com/20047
 evaluate_activation_test/scope: RuntimeError # http://dartbug.com/20047
+regress_28980_test: RuntimeError # Issue 29158, Async debugging
+set_library_debuggable_test: RuntimeError # Issue 29158, Async debugging
 
 [ $arch != ia32 || $arch != x64 || $system != linux ]
 get_native_allocation_samples_test: Skip # Unsupported.
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index afebf2f..fd0455f 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -156,6 +156,7 @@
 break_on_default_constructor_test: Skip # Issues 32137 and 32138.
 coverage_leaf_function_test: RuntimeError
 coverage_optimized_function_test: Skip # Timeout
+field_script_test: Skip # Timeout
 get_source_report_test: RuntimeError
 get_vm_timeline_rpc_test: Skip # Issue 32137.
 issue_25465_test: Skip # Issues 32137 and 32138.
@@ -166,6 +167,7 @@
 next_through_call_on_field_test: Skip # Issues 32137 and 32138.
 next_through_catch_test: Skip # Issues 32137 and 32138.
 next_through_create_list_and_map_test: Skip # Issues 32137 and 32138.
+next_through_for_loop_with_break_and_continue_test: Skip # Timeout
 next_through_function_expression_test: Skip # Issues 32137 and 32138.
 next_through_is_and_as_test: Skip # Issues 32137 and 32138.
 next_through_multi_catch_test: Skip # Issues 32137 and 32138.
@@ -180,7 +182,7 @@
 reload_sources_test: RuntimeError
 set_vm_name_rpc_test: Skip # Times out. Issue 32137.
 step_test: Skip # Issues 32137 and 32138.
-step_through_constructor_test: Pass, Slow
+step_through_constructor_test: Skip # Timeout
 step_through_function_2_test: Skip # Issues 32137 and 32138.
 step_through_function_test: Skip # Issues 32137 and 32138.
 step_through_property_get_test: Skip # Times out. Issue 32137.
@@ -190,23 +192,28 @@
 
 [ $compiler == dartk && $system == windows && $strong ]
 add_breakpoint_rpc_kernel_test: Skip # Timeout
+breakpoint_in_parts_class_test: Skip # Timeout
 code_test: RuntimeError
 get_object_rpc_test: RuntimeError
 get_stack_rpc_test: RuntimeError
+next_through_call_on_static_field_in_class_test: Skip # Timeout
+next_through_closure_test: Skip # Timeout
+next_through_for_each_loop_test: Skip # Timeout
 next_through_implicit_call_test: Skip # Timeout
+next_through_new_test: Skip # Timeout
 next_through_operator_bracket_on_super_test: Skip # Timeout
 next_through_operator_bracket_on_this_test: Skip # Timeout
 next_through_operator_bracket_test: Skip # Timeout
 next_through_simple_async_test: Skip # Timeout
+pause_on_start_and_exit_with_child_test: Skip # Timeout
 step_through_constructor_calls_test: Skip # Timeout
+step_through_getter_test: Skip # Timeout
 step_through_property_set_test: Skip # Timeout
 
 [ $compiler == dartk && $system == windows && !$strong ]
 code_test: RuntimeError
-field_script_test: Skip # Timeout
 get_object_rpc_test: RuntimeError
 get_stack_rpc_test: RuntimeError
-next_through_for_loop_with_break_and_continue_test: Skip # Timeout
 next_through_simple_async_test: Skip # Timeout
 step_test: Skip # Timeout
 step_through_constructor_test: Skip # Timeout
diff --git a/runtime/observatory/tests/service/service_test_common.dart b/runtime/observatory/tests/service/service_test_common.dart
index 71eea66..bf3dca8 100644
--- a/runtime/observatory/tests/service/service_test_common.dart
+++ b/runtime/observatory/tests/service/service_test_common.dart
@@ -116,7 +116,8 @@
         (event.breakpoint == syntheticBreakpoint);
     if (isAdd) {
       syntheticBreakpoint = event.breakpoint;
-    } else if (isResume) {} else if (isPaused) {
+    } else if (isResume) {
+    } else if (isPaused) {
       pausedAtSyntheticBreakpoint.complete(isolate);
       syntheticBreakpoint = null;
       cancelSubscription();
@@ -269,7 +270,7 @@
     ServiceMap stack = await isolate.getStack();
     expect(stack.type, equals('Stack'));
 
-    List/*<Frame>*/ frames = stack['frames'];
+    List frames = stack['frames'];
     expect(frames.length, greaterThanOrEqualTo(1));
 
     Frame top = frames[0];
@@ -297,10 +298,10 @@
     ServiceMap stack = await isolate.getStack();
     expect(stack.type, equals('Stack'));
 
-    List/*<Frame>*/ frames = stack['frames'];
+    List frames = stack['frames'];
     expect(frames.length, greaterThanOrEqualTo(1));
 
-    Frame topFrame = stack['frames'][0];
+    Frame topFrame = frames[0];
     ServiceFunction function = await topFrame.function.load();
     String name = function.name;
     if (includeOwner) {
@@ -315,7 +316,7 @@
       sb.write("Expected to be in function $functionName but "
           "actually in function $name");
       sb.write("\nFull stack trace:\n");
-      for (Frame f in stack['frames']) {
+      for (Frame f in frames) {
         await f.function.load();
         await (f.function.dartOwner as ServiceObject).load();
         String name = f.function.name;
@@ -444,7 +445,7 @@
         // We are paused: Resume after recording.
         ServiceMap stack = await isolate.getStack();
         expect(stack.type, equals('Stack'));
-        List/*<Frame>*/ frames = stack['frames'];
+        List frames = stack['frames'];
         expect(frames.length, greaterThanOrEqualTo(2));
         Frame frame = frames[0];
         String brokeAt = await frame.location.toUserString();
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index df6a616..d129fcb 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -67,6 +67,8 @@
 cc/IsolateReload_KernelIncrementalCompileGenerics: SkipByDesign
 cc/Mixin_PrivateSuperResolution: Skip
 cc/Mixin_PrivateSuperResolutionCrossLibraryShouldFail: Skip
+dart/appjit_determinism_test: Pass, Fail # Issue 31427 - Lingering non-determinism.
+dart/script_determinism_test: Pass, Fail # Issue 31427 - Lingering non-determinism.
 
 [ $compiler == fasta ]
 dart/data_uri_import_test/badencodeddate: CompileTimeError
@@ -128,6 +130,7 @@
 
 [ $arch == x64 && $compiler == dartk && $system == windows && $strong ]
 cc/Profiler_BasicSourcePosition: Fail # http://dartbug.com/33224
+cc/Profiler_CodeTicks: Fail # dartbug.com/33337
 
 [ $arch == x64 && $system == windows ]
 cc/Profiler_BinaryOperatorSourcePositionOptimized: Pass, Fail # Issue 31137
@@ -353,10 +356,6 @@
 cc/StandaloneSnapshotSize: SkipByDesign # Imports dart:mirrors
 dart/redirection_type_shuffling_test: SkipByDesign # Imports dart:mirrors
 
-[ $system == windows || $checked ]
-dart/appjit_determinism_test: Skip # Issue 31427 - Lingering non-determinism in checked mode and Windows.
-dart/script_determinism_test: Skip # Issue 31427 - Lingering non-determinism in checked mode and Windows.
-
 [ $hot_reload || $hot_reload_rollback ]
 dart/appjit_determinism_test: Skip # Reload affects determinisim
 dart/script_determinism_test: Skip # We can shutdown an isolate before it reloads.
diff --git a/runtime/vm/ast_printer.cc b/runtime/vm/ast_printer.cc
index 62b9a3b..f9b190e 100644
--- a/runtime/vm/ast_printer.cc
+++ b/runtime/vm/ast_printer.cc
@@ -124,11 +124,12 @@
                  String::Handle(variable->type().Name()).ToCString(),
                  variable->name().ToCString());
   if (variable->HasIndex()) {
+    const int index = variable->index().value();
     if (variable->is_captured()) {
       logger_->Print(" (context %d %d)", variable->owner()->context_level(),
-                     variable->index());
+                     index);
     } else {
-      logger_->Print(" (stack %d)", variable->index());
+      logger_->Print(" (stack %d)", index);
     }
   }
 }
@@ -415,7 +416,7 @@
     logger_->Print(" alias");
   }
   if (var->HasIndex()) {
-    logger_->Print(" @%d", var->index());
+    logger_->Print(" @%d", var->index().value());
     if (var->is_captured()) {
       logger_->Print(" ctx %d", var->owner()->context_level());
     }
@@ -484,7 +485,7 @@
       logger_->Print(" =%s", default_parameter_value.ToCString());
     }
     if (param->HasIndex()) {
-      logger_->Print(" @%d", param->index());
+      logger_->Print(" @%d", param->index().value());
       if (param->is_captured()) {
         logger_->Print(" ctx %d", param->owner()->context_level());
       }
diff --git a/runtime/vm/ast_printer_test.cc b/runtime/vm/ast_printer_test.cc
index 128317a..7f73a8d 100644
--- a/runtime/vm/ast_printer_test.cc
+++ b/runtime/vm/ast_printer_test.cc
@@ -19,7 +19,7 @@
   LocalVariable* v = new LocalVariable(
       kPos, kPos, String::ZoneHandle(Symbols::New(thread, "wurscht")),
       Type::ZoneHandle(Type::DynamicType()));
-  v->set_index(5);
+  v->set_index(VariableIndex(5));
   AstPrinter ast_printer;
   LoadLocalNode* ll = new LoadLocalNode(kPos, v);
   ReturnNode* r = new ReturnNode(kPos, ll);
diff --git a/runtime/vm/ast_test.cc b/runtime/vm/ast_test.cc
index 2ade4e7..302c1d9 100644
--- a/runtime/vm/ast_test.cc
+++ b/runtime/vm/ast_test.cc
@@ -22,17 +22,17 @@
   EXPECT(!ll->IsLiteralNode());
   LoadLocalNode* lln = ll->AsLoadLocalNode();
   EXPECT(NULL != lln);
-  v->set_index(1);
-  EXPECT_EQ(1, v->index());
+  v->set_index(VariableIndex(1));
+  EXPECT_EQ(1, v->index().value());
 
   LocalVariable* p =
       new LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
                         String::ZoneHandle(Symbols::New(thread, "p")),
                         Type::ZoneHandle(Type::DynamicType()));
   EXPECT(!p->HasIndex());
-  p->set_index(-1);
+  p->set_index(VariableIndex(-1));
   EXPECT(p->HasIndex());
-  EXPECT_EQ(-1, p->index());
+  EXPECT_EQ(-1, p->index().value());
 
   ReturnNode* r = new ReturnNode(TokenPosition::kNoSource, lln);
   EXPECT_EQ(lln, r->value());
diff --git a/runtime/vm/base64.cc b/runtime/vm/base64.cc
new file mode 100644
index 0000000..60e919d
--- /dev/null
+++ b/runtime/vm/base64.cc
@@ -0,0 +1,75 @@
+// 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.
+
+#include "vm/base64.h"
+
+#include "vm/os.h"
+
+namespace dart {
+
+// Taken from lib/_http/crypto.dart
+
+// Lookup table used for finding Base 64 alphabet index of a given byte.
+// -2 : Outside Base 64 alphabet.
+// -1 : '\r' or '\n'
+//  0 : = (Padding character).
+// >0 : Base 64 alphabet index of given byte.
+static const int8_t decode_table[] = {
+    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -2, -2, -1, -2, -2,  //
+    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,  //
+    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 62, -2, 62, -2, 63,  //
+    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, 00, -2, -2,  //
+    -2, 00, 01, 02, 03, 04, 05, 06, 07, 8,  9,  10, 11, 12, 13, 14,  //
+    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -2, -2, -2, -2, 63,  //
+    -2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,  //
+    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -2, -2, -2, -2, -2,  //
+    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,  //
+    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,  //
+    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,  //
+    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,  //
+    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,  //
+    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,  //
+    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,  //
+    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2};
+
+static const char PAD = '=';
+
+uint8_t* DecodeBase64(Zone* zone, const char* str, intptr_t* out_decoded_len) {
+  intptr_t len = strlen(str);
+  if (len == 0 || (len % 4 != 0)) {
+    return nullptr;
+  }
+
+  int pad_length = 0;
+  for (intptr_t i = len - 1; i >= 0; i--) {
+    const uint8_t current_code_unit = str[i];
+    if (decode_table[current_code_unit] > 0) break;
+    if (current_code_unit == PAD) pad_length++;
+  }
+  intptr_t decoded_en = ((len * 6) >> 3) - pad_length;
+  uint8_t* bytes = zone->Alloc<uint8_t>(decoded_en);
+
+  for (int i = 0, o = 0; o < decoded_en;) {
+    // Accumulate 4 valid 6 bit Base 64 characters into an int.
+    int x = 0;
+    for (int j = 4; j > 0;) {
+      int c = decode_table[(uint8_t)str[i++]];
+      if (c >= 0) {
+        x = ((x << 6) & 0xFFFFFF) | c;
+        j--;
+      }
+    }
+    bytes[o++] = x >> 16;
+    if (o < decoded_en) {
+      bytes[o++] = (x >> 8) & 0xFF;
+      if (o < decoded_en) bytes[o++] = x & 0xFF;
+    }
+  }
+  if (out_decoded_len != nullptr) {
+    *out_decoded_len = decoded_en;
+  }
+  return bytes;
+}
+
+}  // namespace dart
diff --git a/runtime/vm/base64.h b/runtime/vm/base64.h
new file mode 100644
index 0000000..575b61b
--- /dev/null
+++ b/runtime/vm/base64.h
@@ -0,0 +1,16 @@
+// 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.
+
+#ifndef RUNTIME_VM_BASE64_H_
+#define RUNTIME_VM_BASE64_H_
+
+#include "vm/zone.h"
+
+namespace dart {
+
+uint8_t* DecodeBase64(Zone* zone, const char* str, intptr_t* out_decoded_len);
+
+}  // namespace dart
+
+#endif  // RUNTIME_VM_BASE64_H_
diff --git a/runtime/vm/base64_test.cc b/runtime/vm/base64_test.cc
new file mode 100644
index 0000000..406a431
--- /dev/null
+++ b/runtime/vm/base64_test.cc
@@ -0,0 +1,32 @@
+// 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.
+
+#include "vm/base64.h"
+
+#include "platform/assert.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+TEST_CASE(Base64Decode) {
+  intptr_t decoded_len;
+  uint8_t* decoded_bytes =
+      DecodeBase64(thread->zone(), "SGVsbG8sIHdvcmxkIQo=", &decoded_len);
+  const char expected_bytes[] = "Hello, world!\n";
+  intptr_t expected_len = strlen(expected_bytes);
+  EXPECT(!memcmp(expected_bytes, decoded_bytes, expected_len));
+  EXPECT_EQ(expected_len, decoded_len);
+}
+
+TEST_CASE(Base64DecodeMalformed) {
+  intptr_t decoded_len;
+  EXPECT(DecodeBase64(thread->zone(), "SomethingMalformed", &decoded_len) ==
+         nullptr);
+}
+
+TEST_CASE(Base64DecodeEmpty) {
+  intptr_t decoded_len;
+  EXPECT(DecodeBase64(thread->zone(), "", &decoded_len) == nullptr);
+}
+}  // namespace dart
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index ffd9821..c7cb303 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -301,6 +301,10 @@
   benchmark->set_score(elapsed_time);
 }
 
+static void NoopFinalizer(void* isolate_callback_data,
+                          Dart_WeakPersistentHandle handle,
+                          void* peer) {}
+
 //
 // Measure time accessing internal and external strings.
 //
@@ -316,7 +320,8 @@
   intptr_t char_size;
   intptr_t str_len;
   Dart_Handle external_string = Dart_NewExternalLatin1String(
-      data8, ARRAY_SIZE(data8), &external_peer_data, NULL);
+      data8, ARRAY_SIZE(data8), &external_peer_data, sizeof(data8),
+      NoopFinalizer);
   Dart_Handle internal_string = NewString("two");
 
   // Run benchmark.
diff --git a/runtime/vm/bigint_test.cc b/runtime/vm/bigint_test.cc
deleted file mode 100644
index 4644a4c..0000000
--- a/runtime/vm/bigint_test.cc
+++ /dev/null
@@ -1,675 +0,0 @@
-// 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.
-
-#include "platform/assert.h"
-#include "vm/object.h"
-#include "vm/object_store.h"
-#include "vm/unit_test.h"
-
-namespace dart {
-
-TEST_CASE(BigintSmi) {
-  if (Bigint::IsDisabled()) {
-    return;
-  }
-
-  {
-    const Smi& smi = Smi::Handle(Smi::New(5));
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromInt64(smi.Value()));
-    EXPECT_EQ(5, bigint.AsInt64Value());
-    EXPECT(bigint.FitsIntoSmi());
-    Smi& smi_back = Smi::Handle();
-    smi_back ^= bigint.AsValidInteger();
-    EXPECT_EQ(5, smi_back.Value());
-  }
-
-  {
-    const Smi& smi = Smi::Handle(Smi::New(Smi::kMaxValue));
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromInt64(smi.Value()));
-    EXPECT(Smi::kMaxValue == bigint.AsInt64Value());
-    EXPECT(bigint.FitsIntoSmi());
-    Smi& smi_back = Smi::Handle();
-    smi_back ^= bigint.AsValidInteger();
-    EXPECT(Smi::kMaxValue == smi_back.Value());
-  }
-
-  {
-    const Smi& smi = Smi::Handle(Smi::New(Smi::kMinValue));
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromInt64(smi.Value()));
-    EXPECT(bigint.IsNegative());
-    EXPECT(Smi::kMinValue == bigint.AsInt64Value());
-    EXPECT(bigint.FitsIntoSmi());
-    Smi& smi_back = Smi::Handle();
-    smi_back ^= bigint.AsValidInteger();
-    EXPECT(Smi::kMinValue == smi_back.Value());
-  }
-
-  {
-    ASSERT(0xFFFFFFF < Smi::kMaxValue);
-    const Smi& smi = Smi::Handle(Smi::New(0xFFFFFFF));
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromInt64(smi.Value()));
-    EXPECT_EQ(0xFFFFFFF, bigint.AsInt64Value());
-    EXPECT(bigint.FitsIntoSmi());
-    Smi& smi_back = Smi::Handle();
-    smi_back ^= bigint.AsValidInteger();
-    EXPECT_EQ(0xFFFFFFF, smi_back.Value());
-  }
-
-  {
-    ASSERT(0x10000000 < Smi::kMaxValue);
-    const Smi& smi = Smi::Handle(Smi::New(0x10000000));
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromInt64(smi.Value()));
-    EXPECT_EQ(0x10000000, bigint.AsInt64Value());
-    EXPECT(bigint.FitsIntoSmi());
-    Smi& smi_back = Smi::Handle();
-    smi_back ^= bigint.AsValidInteger();
-    EXPECT(0x10000000 == smi_back.Value());
-  }
-}
-
-TEST_CASE(BigintInt64) {
-  if (Bigint::IsDisabled()) {
-    return;
-  }
-
-  const int64_t kValue = 100000000;
-  const int64_t kValue64 = kValue * kValue;
-  Bigint& bigint = Bigint::Handle(Bigint::NewFromInt64(kValue));
-  EXPECT_EQ(kValue, bigint.AsInt64Value());
-  bigint = Bigint::NewFromInt64(kValue64);
-  EXPECT_EQ(kValue64, bigint.AsInt64Value());
-  bigint = Bigint::NewFromInt64(-kValue64);
-  EXPECT_EQ(-kValue64, bigint.AsInt64Value());
-  bigint = Bigint::NewFromInt64(kMinInt64);
-  EXPECT(bigint.FitsIntoInt64());
-  EXPECT_EQ(kMinInt64, bigint.AsInt64Value());
-}
-
-TEST_CASE(BigintUint64) {
-  if (Bigint::IsDisabled()) {
-    return;
-  }
-
-  const Bigint& one = Bigint::Handle(Bigint::NewFromUint64(1));
-  EXPECT(one.FitsIntoInt64());
-  EXPECT(one.FitsIntoUint64());
-
-  const Bigint& big = Bigint::Handle(Bigint::NewFromUint64(kMaxUint64));
-  EXPECT(!big.FitsIntoInt64());
-  EXPECT(big.FitsIntoUint64());
-
-  uint64_t back = big.AsUint64Value();
-  EXPECT_EQ(kMaxUint64, back);
-}
-
-TEST_CASE(BigintDouble) {
-  if (Bigint::IsDisabled()) {
-    return;
-  }
-
-  Bigint& bigint = Bigint::Handle(Bigint::NewFromInt64(5));
-  EXPECT_EQ(5.0, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromInt64(0);
-  EXPECT_EQ(0.0, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromInt64(-12345678);
-  EXPECT_EQ(-1.2345678e+7, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString("1");
-  EXPECT_EQ(1.0, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString("123456");
-  EXPECT_EQ(123456.0, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString("123456789");
-  EXPECT_EQ(123456789.0, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString("12345678901234567");
-  EXPECT_EQ(12345678901234568.0, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString("98765432109876");
-  EXPECT_EQ(9.8765432109876e+13, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString("0x17777777777778");
-  EXPECT_EQ(6605279453476728.0, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString("0x37777777777778");
-  EXPECT_EQ(15612478708217720.0, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString("0x177777777777781234567");
-  EXPECT_EQ(1.7730912021014563e+24, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString("0x177777777777788000000");
-  EXPECT_EQ(1.7730912021014563e+24, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString("0x177777777777788000001");
-  EXPECT_EQ(1.7730912021014565e+24, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString("0x177777777777798000000");
-  EXPECT_EQ(1.7730912021014568e+24, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString("0x177777777777798000001");
-  EXPECT_EQ(1.7730912021014568e+24, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString("0x377777777777790000000");
-  EXPECT_EQ(4.1909428413307146e+24, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString("0x377777777777790000001");
-  EXPECT_EQ(4.190942841330715e+24, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString("0x377777777777730000000");
-  EXPECT_EQ(4.1909428413307135e+24, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString("0x377777777777730000001");
-  EXPECT_EQ(4.1909428413307135e+24, bigint.AsDoubleValue());
-
-  // Reduced precision.
-  bigint = Bigint::NewFromCString("9876543210987654321098765432109876543210");
-  EXPECT_EQ(9.8765432109876546e+39, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString(
-      "12345678901234567890123456789012345678901234567890"
-      "12345678901234567890123456789012345678901234567890"
-      "12345678901234567890123456789012345678901234567890"
-      "12345678901234567890123456789012345678901234567890"
-      "12345678901234567890123456789012345678901234567890"
-      "12345678901234567890123456789012345678901234567890"
-      "12345678901234567890123456789012345678901234567890"
-      "12345678901234567890123456789012345678901234567890"
-      "12345678901234567890123456789012345678901234567890"
-      "12345678901234567890123456789012345678901234567890");
-  double zero = 0.0;
-  EXPECT_EQ(1.0 / zero, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString(
-      "17976931348623157081452742373170435679807056752584"
-      "49965989174768031572607800285387605895586327668781"
-      "71540458953514382464234321326889464182768467546703"
-      "53751698604991057655128207624549009038932894407586"
-      "85084551339423045832369032229481658085593321233482"
-      "74797826204144723168738177180919299881250404026184"
-      "124858368");
-  EXPECT_EQ(1.7976931348623157e308, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString(
-      "17976931348623159077293051907890247336179769789423"
-      "06572734300811577326758055009631327084773224075360"
-      "21120113879871393357658789768814416622492847430639"
-      "47412437776789342486548527630221960124609411945308"
-      "29520850057688381506823424628814739131105408272371"
-      "63350510684586298239947245938479716304835356329624"
-      "224137216");
-  EXPECT_EQ(1.0 / zero, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString(
-      "17976931348623158079372897140530341507993413271003"
-      "78269361737789804449682927647509466490179775872070"
-      "96330286416692887910946555547851940402630657488671"
-      "50582068190890200070838367627385484581771153176447"
-      "57302700698555713669596228429148198608349364752927"
-      "19074168444365510704342711559699508093042880177904"
-      "174497792");
-  EXPECT_EQ(1.0 / zero, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString(
-      "17976931348623158079372897140530341507993413271003"
-      "78269361737789804449682927647509466490179775872070"
-      "96330286416692887910946555547851940402630657488671"
-      "50582068190890200070838367627385484581771153176447"
-      "57302700698555713669596228429148198608349364752927"
-      "19074168444365510704342711559699508093042880177904"
-      "174497791");
-  EXPECT_EQ(1.7976931348623157e308, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString("100000000000000000000000");
-  EXPECT_EQ(1e+23, bigint.AsDoubleValue());
-
-  bigint = Bigint::NewFromCString("100000000000000000000001");
-  EXPECT_EQ(1.0000000000000001e+23, bigint.AsDoubleValue());
-
-  // Same but shifted 64 bits to the left.
-  bigint =
-      Bigint::NewFromCString("1844674407370955161600000000000000000000000");
-  EXPECT_EQ(1.844674407370955e+42, bigint.AsDoubleValue());
-
-  bigint =
-      Bigint::NewFromCString("1844674407370955161600000000000000000000001");
-  EXPECT_EQ(1.8446744073709553e+42, bigint.AsDoubleValue());
-}
-
-TEST_CASE(BigintHexStrings) {
-  if (Bigint::IsDisabled()) {
-    return;
-  }
-
-  Zone* zone = Thread::Current()->zone();
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x0"));
-    EXPECT(bigint.FitsIntoSmi());
-    EXPECT_EQ(0, bigint.AsInt64Value());
-  }
-
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x1"));
-    EXPECT(bigint.FitsIntoSmi());
-    EXPECT_EQ(1, bigint.AsInt64Value());
-  }
-
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x123"));
-    EXPECT(bigint.FitsIntoSmi());
-    EXPECT_EQ(0x123, bigint.AsInt64Value());
-  }
-
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x123"));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ("0x123", str);
-  }
-
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0xaBcEf"));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ("0xABCEF", str);
-  }
-
-  {
-    const char* in = "0x123456789";
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ(in, str);
-  }
-
-  {
-    const char* in = "0xFFFFFFF";
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ(in, str);
-  }
-
-  {
-    const char* in = "0x10000000";
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ(in, str);
-  }
-
-  {
-    const char* in = "0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ(in, str);
-  }
-
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-0x123"));
-    EXPECT(bigint.FitsIntoSmi());
-    EXPECT_EQ(-0x123, bigint.AsInt64Value());
-  }
-
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-0x123"));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ("-0x123", str);
-  }
-
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-0xaBcEf"));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ("-0xABCEF", str);
-  }
-
-  {
-    const char* in = "-0x123456789";
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ(in, str);
-  }
-
-  {
-    const char* in = "-0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ(in, str);
-  }
-
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x00000123"));
-    EXPECT(bigint.FitsIntoSmi());
-    EXPECT_EQ(0x123, bigint.AsInt64Value());
-  }
-
-  {
-    const Bigint& bigint =
-        Bigint::Handle(Bigint::NewFromCString("0x000000123"));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ("0x123", str);
-  }
-
-  {
-    const Bigint& bigint =
-        Bigint::Handle(Bigint::NewFromCString("0x0000aBcEf"));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ("0xABCEF", str);
-  }
-
-  {
-    const char* in = "0x00000000000000000000000000000000000000000000123456789";
-    const char* out = "0x123456789";
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ(out, str);
-  }
-
-  {
-    const char* in = "0x00000123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
-    const char* out = "0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ(out, str);
-  }
-
-  {
-    const Bigint& bigint =
-        Bigint::Handle(Bigint::NewFromCString("-0x00000123"));
-    EXPECT(bigint.FitsIntoSmi());
-    EXPECT_EQ(-0x123, bigint.AsInt64Value());
-  }
-
-  {
-    const Bigint& bigint =
-        Bigint::Handle(Bigint::NewFromCString("-0x00000123"));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ("-0x123", str);
-  }
-
-  {
-    const Bigint& bigint =
-        Bigint::Handle(Bigint::NewFromCString("-0x000aBcEf"));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ("-0xABCEF", str);
-  }
-
-  {
-    const char* in = "-0x00000000000000000000000000000000000000000000123456789";
-    const char* out = "-0x123456789";
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ(out, str);
-  }
-
-  {
-    const char* in = "-0x0000123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
-    const char* out = "-0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ(out, str);
-  }
-  {
-    const char* test = "12345678901234567890";
-    const char* out = "0xAB54A98CEB1F0AD2";
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(test));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ(out, str);
-  }
-  {
-    const char* test = "-12345678901234567890";
-    const char* out = "-0xAB54A98CEB1F0AD2";
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(test));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ(out, str);
-  }
-}
-
-TEST_CASE(BigintDecStrings) {
-  if (Bigint::IsDisabled()) {
-    return;
-  }
-
-  Zone* zone = Thread::Current()->zone();
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x0"));
-    const char* str = bigint.ToDecCString(zone);
-    EXPECT_STREQ("0", str);
-  }
-
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x123"));
-    const char* str = bigint.ToDecCString(zone);
-    EXPECT_STREQ("291", str);
-  }
-
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0xaBcEf"));
-    const char* str = bigint.ToDecCString(zone);
-    EXPECT_STREQ("703727", str);
-  }
-
-  {
-    const char* in = "0x123456789";
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
-    const char* str = bigint.ToDecCString(zone);
-    EXPECT_STREQ("4886718345", str);
-  }
-
-  {
-    const char* in = "0xFFFFFFF";
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
-    const char* str = bigint.ToDecCString(zone);
-    EXPECT_STREQ("268435455", str);
-  }
-
-  {
-    const char* in = "0x10000000";
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
-    const char* str = bigint.ToDecCString(zone);
-    EXPECT_STREQ("268435456", str);
-  }
-
-  {
-    const char* in = "0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
-    const char* str = bigint.ToDecCString(zone);
-    EXPECT_STREQ("7141946863373290020600059860922167424469804758405880798960",
-                 str);
-  }
-
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-0x123"));
-    EXPECT(bigint.FitsIntoSmi());
-    EXPECT_EQ(-291, bigint.AsInt64Value());
-  }
-
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-0x123"));
-    const char* str = bigint.ToDecCString(zone);
-    EXPECT_STREQ("-291", str);
-  }
-
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-0xaBcEf"));
-    const char* str = bigint.ToDecCString(zone);
-    EXPECT_STREQ("-703727", str);
-  }
-
-  {
-    const char* in = "-0x123456789";
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
-    const char* str = bigint.ToDecCString(zone);
-    EXPECT_STREQ("-4886718345", str);
-  }
-
-  {
-    const char* in = "-0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
-    const char* str = bigint.ToDecCString(zone);
-    EXPECT_STREQ("-7141946863373290020600059860922167424469804758405880798960",
-                 str);
-  }
-
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x00000123"));
-    EXPECT(bigint.FitsIntoSmi());
-    EXPECT_EQ(0x123, bigint.AsInt64Value());
-  }
-
-  {
-    const Bigint& bigint =
-        Bigint::Handle(Bigint::NewFromCString("0x000000123"));
-    const char* str = bigint.ToDecCString(zone);
-    EXPECT_STREQ("291", str);
-  }
-
-  {
-    const Bigint& bigint = Bigint::Handle(
-        Bigint::NewFromCString("100000000000000000000000000000000"));
-    const char* str = bigint.ToDecCString(zone);
-    EXPECT_STREQ("100000000000000000000000000000000", str);
-  }
-}
-
-static void TestBigintCompare(const char* a, const char* b, int compare) {
-  const Bigint& bigint_a = Bigint::Handle(Bigint::NewFromCString(a));
-  const Bigint& bigint_b = Bigint::Handle(Bigint::NewFromCString(b));
-  const Integer& int_a = Integer::Handle(bigint_a.AsValidInteger());
-  const Integer& int_b = Integer::Handle(bigint_b.AsValidInteger());
-  int computed_compare = int_a.CompareWith(int_b);
-  int inverted_compare = int_b.CompareWith(int_a);
-  if (compare == 0) {
-    EXPECT(computed_compare == 0);
-    EXPECT(inverted_compare == 0);
-  } else if (compare < 0) {
-    ASSERT(computed_compare < 0);
-    EXPECT(computed_compare < 0);
-    EXPECT(inverted_compare > 0);
-  } else {
-    ASSERT(compare > 0);
-    EXPECT(computed_compare > 0);
-    EXPECT(inverted_compare < 0);
-  }
-}
-
-TEST_CASE(BigintCompare) {
-  if (Bigint::IsDisabled()) {
-    return;
-  }
-
-  TestBigintCompare("0x0", "0x0", 0);
-  TestBigintCompare("0x1", "0x1", 0);
-  TestBigintCompare("-0x1", "-0x1", 0);
-  TestBigintCompare("0x1234567", "0x1234567", 0);
-  TestBigintCompare("-0x1234567", "-0x1234567", 0);
-  TestBigintCompare("0x12345678", "0x12345678", 0);
-  TestBigintCompare("-0x12345678", "-0x12345678", 0);
-  TestBigintCompare("0x123456789ABCDEF0", "0x123456789ABCDEF0", 0);
-  TestBigintCompare("-0x123456789ABCDEF0", "-0x123456789ABCDEF0", 0);
-  TestBigintCompare("0x123456789ABCDEF01", "0x123456789ABCDEF01", 0);
-  TestBigintCompare("-0x123456789ABCDEF01", "-0x123456789ABCDEF01", 0);
-  TestBigintCompare("0x1", "0x0", 1);
-  TestBigintCompare("-0x1", "-0x2", 1);
-  TestBigintCompare("0x1234567", "0x1234566", 1);
-  TestBigintCompare("-0x1234567", "-0x1234568", 1);
-  TestBigintCompare("0x12345678", "0x12345677", 1);
-  TestBigintCompare("-0x12345678", "-0x12345679", 1);
-  TestBigintCompare("0x123456789ABCDEF1", "0x123456789ABCDEF0", 1);
-  TestBigintCompare("-0x123456789ABCDEF0", "-0x123456789ABCDEF1", 1);
-  TestBigintCompare("0x123456789ABCDEF02", "0x123456789ABCDEF01", 1);
-  TestBigintCompare("-0x123456789ABCDEF00", "-0x123456789ABCDEF01", 1);
-  TestBigintCompare("0x10000000", "0xFFFFFFF", 1);
-  TestBigintCompare("-0x10000000", "-0xFFFFFFF", -1);
-  TestBigintCompare("0x100000000", "0xFFFFFFFF", 1);
-  TestBigintCompare("-0x100000000", "-0xFFFFFFFF", -1);
-  TestBigintCompare("0x10000000000000000", "0xFFFFFFFFFFFFFFFF", 1);
-  TestBigintCompare("-0x10000000000000000", "-0xFFFFFFFFFFFFFFFF", -1);
-  TestBigintCompare("0x10000000000000000", "0x0", 1);
-  TestBigintCompare("-0x10000000000000000", "0x0", -1);
-  TestBigintCompare("-0x1234567", "0x1234566", -1);
-  TestBigintCompare("-0x1234567", "0x1234568", -1);
-  TestBigintCompare("-0x12345678", "0x12345677", -1);
-  TestBigintCompare("-0x12345678", "0x12345670", -1);
-  TestBigintCompare("-0x123456789ABCDEF1", "0x123456789ABCDEF0", -1);
-  TestBigintCompare("-0x123456789ABCDEF0", "0x123456789ABCDEF1", -1);
-  TestBigintCompare("-0x123456789ABCDEF02", "0x123456789ABCDEF01", -1);
-  TestBigintCompare("-0x123456789ABCDEF00", "0x123456789ABCDEF01", -1);
-  TestBigintCompare("-0x10000000", "0xFFFFFFF", -1);
-  TestBigintCompare("-0x10000000", "0xFFFFFFF", -1);
-  TestBigintCompare("-0x100000000", "0xFFFFFFFF", -1);
-  TestBigintCompare("-0x100000000", "0xFFFFFFFF", -1);
-  TestBigintCompare("-0x10000000000000000", "0xFFFFFFFFFFFFFFFF", -1);
-  TestBigintCompare("-0x10000000000000000", "0xFFFFFFFFFFFFFFFF", -1);
-  TestBigintCompare("-0x10000000000000000", "0x0", -1);
-  TestBigintCompare("-0x10000000000000000", "0x0", -1);
-}
-
-TEST_CASE(BigintDecimalStrings) {
-  if (Bigint::IsDisabled()) {
-    return;
-  }
-
-  Zone* zone = Thread::Current()->zone();
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0"));
-    EXPECT(bigint.FitsIntoSmi());
-    EXPECT_EQ(0, bigint.AsInt64Value());
-  }
-
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("1"));
-    EXPECT(bigint.FitsIntoSmi());
-    EXPECT_EQ(1, bigint.AsInt64Value());
-  }
-
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("703710"));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ("0xABCDE", str);
-  }
-
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("11259375"));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ("0xABCDEF", str);
-  }
-
-  {
-    const Bigint& bigint =
-        Bigint::Handle(Bigint::NewFromCString("1311768467463790320"));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ("0x123456789ABCDEF0", str);
-  }
-
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-0"));
-    EXPECT(bigint.FitsIntoSmi());
-    EXPECT_EQ(0, bigint.AsInt64Value());
-  }
-
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-1"));
-    EXPECT(bigint.FitsIntoSmi());
-    EXPECT_EQ(-1, bigint.AsInt64Value());
-  }
-
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-703710"));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ("-0xABCDE", str);
-  }
-
-  {
-    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-11259375"));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ("-0xABCDEF", str);
-  }
-
-  {
-    const Bigint& bigint =
-        Bigint::Handle(Bigint::NewFromCString("-1311768467463790320"));
-    const char* str = bigint.ToHexCString(zone);
-    EXPECT_STREQ("-0x123456789ABCDEF0", str);
-  }
-}
-
-}  // namespace dart
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index eb76282..cdbb56d 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -62,10 +62,6 @@
   V(Mint_bitNegate, 1)                                                         \
   V(Mint_bitLength, 1)                                                         \
   V(Mint_shlFromInt, 2)                                                        \
-  V(Bigint_getNeg, 1)                                                          \
-  V(Bigint_getUsed, 1)                                                         \
-  V(Bigint_getDigits, 1)                                                       \
-  V(Bigint_allocate, 4)                                                        \
   V(Developer_debugger, 2)                                                     \
   V(Developer_getIsolateIDFromSendPort, 1)                                     \
   V(Developer_getServerInfo, 1)                                                \
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 92ba3ed..bceab3b 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -3266,7 +3266,6 @@
       case kIntegerCid:  // Class Integer, not int.
       case kSmiCid:
       case kMintCid:
-      case kBigintCid:
       case kDoubleCid:  // Class Double, not double.
       case kOneByteStringCid:
       case kTwoByteStringCid:
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 4cce63f..869d283 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -3685,83 +3685,6 @@
 };
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-class BigintSerializationCluster : public SerializationCluster {
- public:
-  BigintSerializationCluster() : SerializationCluster("Bigint") {}
-  virtual ~BigintSerializationCluster() {}
-
-  void Trace(Serializer* s, RawObject* object) {
-    RawBigint* bigint = Bigint::RawCast(object);
-    objects_.Add(bigint);
-
-    RawObject** from = bigint->from();
-    RawObject** to = bigint->to();
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
-  }
-
-  void WriteAlloc(Serializer* s) {
-    s->WriteCid(kBigintCid);
-    intptr_t count = objects_.length();
-    s->WriteUnsigned(count);
-    for (intptr_t i = 0; i < count; i++) {
-      RawBigint* bigint = objects_[i];
-      s->AssignRef(bigint);
-    }
-  }
-
-  void WriteFill(Serializer* s) {
-    intptr_t count = objects_.length();
-    for (intptr_t i = 0; i < count; i++) {
-      RawBigint* bigint = objects_[i];
-      s->Write<bool>(bigint->IsCanonical());
-      RawObject** from = bigint->from();
-      RawObject** to = bigint->to();
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
-    }
-  }
-
- private:
-  GrowableArray<RawBigint*> objects_;
-};
-#endif  // !DART_PRECOMPILED_RUNTIME
-
-class BigintDeserializationCluster : public DeserializationCluster {
- public:
-  BigintDeserializationCluster() {}
-  virtual ~BigintDeserializationCluster() {}
-
-  void ReadAlloc(Deserializer* d) {
-    start_index_ = d->next_index();
-    PageSpace* old_space = d->heap()->old_space();
-    intptr_t count = d->ReadUnsigned();
-    for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space, Bigint::InstanceSize()));
-    }
-    stop_index_ = d->next_index();
-  }
-
-  void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
-    for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawBigint* bigint = reinterpret_cast<RawBigint*>(d->Ref(id));
-      bool is_canonical = d->Read<bool>();
-      Deserializer::InitializeHeader(bigint, kBigintCid, Bigint::InstanceSize(),
-                                     is_vm_object, is_canonical);
-      RawObject** from = bigint->from();
-      RawObject** to = bigint->to();
-      for (RawObject** p = from; p <= to; p++) {
-        *p = d->ReadRef();
-      }
-    }
-  }
-};
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
 class DoubleSerializationCluster : public SerializationCluster {
  public:
   DoubleSerializationCluster() : SerializationCluster("Double") {}
@@ -4813,8 +4736,6 @@
       return new (Z) ClosureSerializationCluster();
     case kMintCid:
       return new (Z) MintSerializationCluster();
-    case kBigintCid:
-      return new (Z) BigintSerializationCluster();
     case kDoubleCid:
       return new (Z) DoubleSerializationCluster();
     case kGrowableObjectArrayCid:
@@ -5338,8 +5259,6 @@
       return new (Z) ClosureDeserializationCluster();
     case kMintCid:
       return new (Z) MintDeserializationCluster();
-    case kBigintCid:
-      return new (Z) BigintDeserializationCluster();
     case kDoubleCid:
       return new (Z) DoubleDeserializationCluster();
     case kGrowableObjectArrayCid:
diff --git a/runtime/vm/compiler/aot/aot_call_specializer.cc b/runtime/vm/compiler/aot/aot_call_specializer.cc
index 4fea9a6..83f76d1 100644
--- a/runtime/vm/compiler/aot/aot_call_specializer.cc
+++ b/runtime/vm/compiler/aot/aot_call_specializer.cc
@@ -272,8 +272,7 @@
       return true;
     }
 
-    if (FLAG_limit_ints_to_64_bits &&
-        FlowGraphCompiler::SupportsUnboxedInt64() &&
+    if (FlowGraphCompiler::SupportsUnboxedInt64() &&
         FlowGraphCompiler::CanConvertInt64ToDouble()) {
       return true;
     }
@@ -286,8 +285,7 @@
                                                 intptr_t cid,
                                                 Instruction* call) {
   ASSERT(I->strong() && FLAG_use_strong_mode_types);
-  ASSERT((cid == kDoubleCid) ||
-         (FLAG_limit_ints_to_64_bits && (cid == kMintCid)));
+  ASSERT((cid == kDoubleCid) || (cid == kMintCid));
 
   const String& function_name =
       (call->IsInstanceCall()
@@ -303,8 +301,7 @@
 
     if (input->Type()->ToNullableCid() == kSmiCid) {
       conversion = new (Z) SmiToDoubleInstr(input, call->token_pos());
-    } else if (FLAG_limit_ints_to_64_bits &&
-               FlowGraphCompiler::SupportsUnboxedInt64() &&
+    } else if (FlowGraphCompiler::SupportsUnboxedInt64() &&
                FlowGraphCompiler::CanConvertInt64ToDouble()) {
       conversion = new (Z) Int64ToDoubleInstr(input, Thread::kNoDeoptId,
                                               Instruction::kNotSpeculative);
@@ -325,8 +322,7 @@
 Value* AotCallSpecializer::PrepareReceiverOfDevirtualizedCall(Value* input,
                                                               intptr_t cid) {
   ASSERT(I->strong() && FLAG_use_strong_mode_types);
-  ASSERT((cid == kDoubleCid) ||
-         (FLAG_limit_ints_to_64_bits && (cid == kMintCid)));
+  ASSERT((cid == kDoubleCid) || (cid == kMintCid));
 
   // Can't assert !input->Type()->is_nullable() here as PushArgument receives
   // value prior to a CheckNull in case of devirtualized call.
@@ -374,8 +370,7 @@
       CompileType* left_type = left_value->Type();
       CompileType* right_type = right_value->Type();
       if (left_type->IsNullableInt() && right_type->IsNullableInt()) {
-        if (FLAG_limit_ints_to_64_bits &&
-            FlowGraphCompiler::SupportsUnboxedInt64()) {
+        if (FlowGraphCompiler::SupportsUnboxedInt64()) {
           if (Token::IsRelationalOperator(op_kind)) {
             left_value = PrepareStaticOpInput(left_value, kMintCid, instr);
             right_value = PrepareStaticOpInput(right_value, kMintCid, instr);
@@ -445,8 +440,7 @@
       CompileType* right_type = right_value->Type();
       if (left_type->IsNullableInt() && right_type->IsNullableInt() &&
           (op_kind != Token::kDIV)) {
-        if (FLAG_limit_ints_to_64_bits &&
-            FlowGraphCompiler::SupportsUnboxedInt64()) {
+        if (FlowGraphCompiler::SupportsUnboxedInt64()) {
           if ((op_kind == Token::kSHR) || (op_kind == Token::kSHL)) {
             // TODO(dartbug.com/30480): Enable 64-bit integer shifts.
             // replacement = new ShiftInt64OpInstr(
@@ -526,8 +520,7 @@
   // instance calls of these operators into static calls.
 
   if (owner.id() == kIntegerCid) {
-    if (!FLAG_limit_ints_to_64_bits ||
-        !FlowGraphCompiler::SupportsUnboxedInt64()) {
+    if (!FlowGraphCompiler::SupportsUnboxedInt64()) {
       return false;
     }
 
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 414b63a..e419327 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -2132,11 +2132,7 @@
         }
       }
       intptr_t cid = cls.id();
-      if (cid == kBigintCid) {
-        // Constants stored as a plain list, no rehashing needed.
-        constants = Array::MakeFixedLength(retained_constants);
-        cls.set_constants(constants);
-      } else if (cid == kDoubleCid) {
+      if (cid == kDoubleCid) {
         // Rehash.
         cls.set_constants(Object::empty_array());
         for (intptr_t j = 0; j < retained_constants.Length(); j++) {
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index 39858e9..55fcc83 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -493,9 +493,7 @@
   if (IsNonConstant(left) || IsNonConstant(right)) {
     SetValue(instr, non_constant_);
   } else if (IsConstant(left) && IsConstant(right)) {
-    // BitOp does not work on Bigints.
-    if (left.IsInteger() && right.IsInteger() && !left.IsBigint() &&
-        !right.IsBigint()) {
+    if (left.IsInteger() && right.IsInteger()) {
       const bool result = CompareIntegers(
           instr->kind(),
           Integer::Handle(Z, Integer::Cast(left).BitOp(Token::kBIT_AND,
diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc
index c4740e2..510052d 100644
--- a/runtime/vm/compiler/backend/flow_graph.cc
+++ b/runtime/vm/compiler/backend/flow_graph.cc
@@ -612,7 +612,6 @@
   explicit VariableLivenessAnalysis(FlowGraph* flow_graph)
       : LivenessAnalysis(flow_graph->variable_count(), flow_graph->postorder()),
         flow_graph_(flow_graph),
-        num_direct_parameters_(flow_graph->num_direct_parameters()),
         assigned_vars_() {}
 
   // For every block (in preorder) compute and return set of variables that
@@ -657,7 +656,7 @@
       return false;
     }
     if (store->is_last()) {
-      const intptr_t index = store->local().BitIndexIn(num_direct_parameters_);
+      const intptr_t index = flow_graph_->EnvIndex(&store->local());
       return GetLiveOutSet(block)->Contains(index);
     }
 
@@ -670,7 +669,7 @@
     if (load->local().Equals(*flow_graph_->CurrentContextVar())) {
       return false;
     }
-    const intptr_t index = load->local().BitIndexIn(num_direct_parameters_);
+    const intptr_t index = flow_graph_->EnvIndex(&load->local());
     return load->is_last() && !GetLiveOutSet(block)->Contains(index);
   }
 
@@ -678,7 +677,6 @@
   virtual void ComputeInitialSets();
 
   const FlowGraph* flow_graph_;
-  const intptr_t num_direct_parameters_;
   GrowableArray<BitVector*> assigned_vars_;
 };
 
@@ -710,7 +708,7 @@
 
       LoadLocalInstr* load = current->AsLoadLocal();
       if (load != NULL) {
-        const intptr_t index = load->local().BitIndexIn(num_direct_parameters_);
+        const intptr_t index = flow_graph_->EnvIndex(&load->local());
         if (index >= live_in->length()) continue;  // Skip tmp_locals.
         live_in->Add(index);
         if (!last_loads->Contains(index)) {
@@ -722,8 +720,7 @@
 
       StoreLocalInstr* store = current->AsStoreLocal();
       if (store != NULL) {
-        const intptr_t index =
-            store->local().BitIndexIn(num_direct_parameters_);
+        const intptr_t index = flow_graph_->EnvIndex(&store->local());
         if (index >= live_in->length()) continue;  // Skip tmp_locals.
         if (kill->Contains(index)) {
           if (!live_in->Contains(index)) {
@@ -989,8 +986,7 @@
         AllocateSSAIndexes(defn);
         AddToInitialDefinitions(defn);
 
-        intptr_t index = parsed_function_.RawParameterVariable(i)->BitIndexIn(
-            num_direct_parameters_);
+        intptr_t index = EnvIndex(parsed_function_.RawParameterVariable(i));
         env[index] = defn;
       }
     }
@@ -1086,13 +1082,11 @@
                  block_entry->AsCatchBlockEntry()) {
     const intptr_t raw_exception_var_envindex =
         catch_entry->raw_exception_var() != nullptr
-            ? catch_entry->raw_exception_var()->BitIndexIn(
-                  num_direct_parameters_)
+            ? EnvIndex(catch_entry->raw_exception_var())
             : -1;
     const intptr_t raw_stacktrace_var_envindex =
         catch_entry->raw_stacktrace_var() != nullptr
-            ? catch_entry->raw_stacktrace_var()->BitIndexIn(
-                  num_direct_parameters_)
+            ? EnvIndex(catch_entry->raw_stacktrace_var())
             : -1;
 
     // Add real definitions for all locals and parameters.
@@ -1143,13 +1137,11 @@
     const LocalVariable* raw_exception_var = catch_entry->raw_exception_var();
     const LocalVariable* raw_stacktrace_var = catch_entry->raw_stacktrace_var();
     if (raw_exception_var != nullptr) {
-      Value* value = deopt_env->ValueAt(
-          raw_exception_var->BitIndexIn(num_direct_parameters_));
+      Value* value = deopt_env->ValueAt(EnvIndex(raw_exception_var));
       value->BindToEnvironment(constant_null());
     }
     if (raw_stacktrace_var != nullptr) {
-      Value* value = deopt_env->ValueAt(
-          raw_stacktrace_var->BitIndexIn(num_direct_parameters_));
+      Value* value = deopt_env->ValueAt(EnvIndex(raw_stacktrace_var));
       value->BindToEnvironment(constant_null());
     }
   }
@@ -1201,10 +1193,11 @@
     switch (current->tag()) {
       case Instruction::kLoadLocal: {
         LoadLocalInstr* load = current->Cast<LoadLocalInstr>();
+
         // The graph construction ensures we do not have an unused LoadLocal
         // computation.
         ASSERT(load->HasTemp());
-        const intptr_t index = load->local().BitIndexIn(num_direct_parameters_);
+        const intptr_t index = EnvIndex(&load->local());
         result = (*env)[index];
 
         PhiInstr* phi = result->AsPhi();
@@ -1245,8 +1238,7 @@
 
       case Instruction::kStoreLocal: {
         StoreLocalInstr* store = current->Cast<StoreLocalInstr>();
-        const intptr_t index =
-            store->local().BitIndexIn(num_direct_parameters_);
+        const intptr_t index = EnvIndex(&store->local());
         result = store->value()->definition();
 
         if (!FLAG_prune_dead_locals ||
diff --git a/runtime/vm/compiler/backend/flow_graph.h b/runtime/vm/compiler/backend/flow_graph.h
index ac09be0..dbd7564 100644
--- a/runtime/vm/compiler/backend/flow_graph.h
+++ b/runtime/vm/compiler/backend/flow_graph.h
@@ -130,17 +130,20 @@
   }
 
   intptr_t CurrentContextEnvIndex() const {
-    return parsed_function().current_context_var()->BitIndexIn(
-        num_direct_parameters_);
+    return EnvIndex(parsed_function().current_context_var());
   }
 
   intptr_t RawTypeArgumentEnvIndex() const {
-    return parsed_function().RawTypeArgumentsVariable()->BitIndexIn(
-        num_direct_parameters_);
+    return EnvIndex(parsed_function().RawTypeArgumentsVariable());
   }
 
   intptr_t ArgumentDescriptorEnvIndex() const {
-    return parsed_function().arg_desc_var()->BitIndexIn(num_direct_parameters_);
+    return EnvIndex(parsed_function().arg_desc_var());
+  }
+
+  intptr_t EnvIndex(const LocalVariable* variable) const {
+    ASSERT(!variable->is_captured());
+    return num_direct_parameters_ - variable->index().value();
   }
 
   // Flow graph orders.
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index 187e12f..9b611ee 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -77,7 +77,9 @@
   for (Environment::ShallowIterator it(env); !it.Done(); it.Advance()) {
     if (it.CurrentLocation().IsInvalid() &&
         it.CurrentValue()->definition()->IsPushArgument()) {
-      it.SetCurrentLocation(Location::StackSlot((*stack_height)++));
+      it.SetCurrentLocation(
+          Location::StackSlot(FrameSlotForVariableIndex(-*stack_height)));
+      (*stack_height)++;
     }
   }
 }
@@ -361,16 +363,17 @@
         catch_entry_state_maps_builder_->AppendConstant(id, dest_index);
         continue;
       }
-      if (src.stack_index() != dest_index) {
-        catch_entry_state_maps_builder_->AppendMove(src.stack_index(),
-                                                    dest_index);
+      const intptr_t src_index = -VariableIndexForFrameSlot(src.stack_index());
+      if (src_index != dest_index) {
+        catch_entry_state_maps_builder_->AppendMove(src_index, dest_index);
       }
     }
 
     // Process locals. Skip exception_var and stacktrace_var.
-    intptr_t local_base = kFirstLocalSlotFromFp + num_direct_parameters;
-    intptr_t ex_idx = local_base - catch_block->exception_var().index();
-    intptr_t st_idx = local_base - catch_block->stacktrace_var().index();
+    intptr_t local_base = num_direct_parameters;
+    intptr_t ex_idx = local_base - catch_block->exception_var().index().value();
+    intptr_t st_idx =
+        local_base - catch_block->stacktrace_var().index().value();
     for (; i < flow_graph().variable_count(); ++i) {
       // Don't sync captured parameters. They are not in the environment.
       if (flow_graph().captured_parameters()->Contains(i)) continue;
@@ -390,9 +393,9 @@
         catch_entry_state_maps_builder_->AppendConstant(id, dest_index);
         continue;
       }
-      if (src.stack_index() != dest_index) {
-        catch_entry_state_maps_builder_->AppendMove(src.stack_index(),
-                                                    dest_index);
+      const intptr_t src_index = -VariableIndexForFrameSlot(src.stack_index());
+      if (src_index != dest_index) {
+        catch_entry_state_maps_builder_->AppendMove(src_index, dest_index);
       }
     }
     catch_entry_state_maps_builder_->EndMapping();
@@ -940,7 +943,8 @@
     info.scope_id = 0;
     info.begin_pos = TokenPosition::kMinSource;
     info.end_pos = TokenPosition::kMinSource;
-    info.set_index(parsed_function().current_context_var()->index());
+    info.set_index(
+        FrameSlotForVariable(parsed_function().current_context_var()));
     var_descs.SetVar(0, Symbols::CurrentContextVar(), &info);
   }
   code.set_var_descriptors(var_descs);
@@ -1184,10 +1188,8 @@
   if (type.IsNumberType()) {
     args.Add(kDoubleCid);
     args.Add(kMintCid);
-    args.Add(kBigintCid);
   } else if (type.IsIntType()) {
     args.Add(kMintCid);
-    args.Add(kBigintCid);
   } else if (type.IsDoubleType()) {
     args.Add(kDoubleCid);
   }
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.h b/runtime/vm/compiler/backend/flow_graph_compiler.h
index 8185f32..f31d130 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.h
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.h
@@ -597,11 +597,6 @@
 
   // If the cid does not fit in 16 bits, then this will cause a bailout.
   uint16_t ToEmbeddableCid(intptr_t cid, Instruction* instruction);
-
-  // In optimized code, variables at the catch block entry reside at the top
-  // of the allocatable register range.
-  // Must be in sync with FlowGraphAllocator::ProcessInitialDefinition.
-  intptr_t CatchEntryRegForVariable(const LocalVariable& var);
 #endif  // defined(TARGET_ARCH_DBC)
 
   CompilerDeoptInfo* AddDeoptIndexAtCall(intptr_t deopt_id);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index e41694f..6d150d3 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -361,7 +361,7 @@
     __ b(is_not_instance_lbl);
     return false;
   }
-  // Custom checking for numbers (Smi, Mint, Bigint and Double).
+  // Custom checking for numbers (Smi, Mint and Double).
   // Note that instance is not Smi (checked above).
   if (type.IsNumberType() || type.IsIntType() || type.IsDoubleType()) {
     GenerateNumberTypeCheck(kClassIdReg, type, is_instance_lbl,
@@ -848,20 +848,19 @@
   if (!is_optimizing()) {
     const int num_locals = parsed_function().num_stack_locals();
 
-    intptr_t args_desc_index = -1;
+    intptr_t args_desc_slot = -1;
     if (parsed_function().has_arg_desc_var()) {
-      args_desc_index =
-          -(parsed_function().arg_desc_var()->index() - kFirstLocalSlotFromFp);
+      args_desc_slot = FrameSlotForVariable(parsed_function().arg_desc_var());
     }
 
     __ Comment("Initialize spill slots");
-    if (num_locals > 1 || (num_locals == 1 && args_desc_index == -1)) {
+    if (num_locals > 1 || (num_locals == 1 && args_desc_slot == -1)) {
       __ LoadObject(R0, Object::null_object());
     }
     for (intptr_t i = 0; i < num_locals; ++i) {
-      Register value_reg = i == args_desc_index ? ARGS_DESC_REG : R0;
-      __ StoreToOffset(kWord, value_reg, FP,
-                       (kFirstLocalSlotFromFp - i) * kWordSize);
+      const intptr_t slot_index = FrameSlotForVariableIndex(-i);
+      Register value_reg = slot_index == args_desc_slot ? ARGS_DESC_REG : R0;
+      __ StoreToOffset(kWord, value_reg, FP, slot_index * kWordSize);
     }
   }
 
@@ -1085,7 +1084,7 @@
     TokenPosition token_pos,
     intptr_t deopt_id) {
   if (needs_number_check) {
-    ASSERT(!obj.IsMint() && !obj.IsDouble() && !obj.IsBigint());
+    ASSERT(!obj.IsMint() && !obj.IsDouble());
     __ Push(reg);
     __ PushObject(obj);
     if (is_optimizing()) {
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index a74cec8..cef314e 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -347,7 +347,7 @@
     __ b(is_not_instance_lbl);
     return false;
   }
-  // Custom checking for numbers (Smi, Mint, Bigint and Double).
+  // Custom checking for numbers (Smi, Mint and Double).
   // Note that instance is not Smi (checked above).
   if (type.IsNumberType() || type.IsIntType() || type.IsDoubleType()) {
     GenerateNumberTypeCheck(kClassIdReg, type, is_instance_lbl,
@@ -830,19 +830,19 @@
   if (!is_optimizing()) {
     const int num_locals = parsed_function().num_stack_locals();
 
-    intptr_t args_desc_index = -1;
+    intptr_t args_desc_slot = -1;
     if (parsed_function().has_arg_desc_var()) {
-      args_desc_index =
-          -(parsed_function().arg_desc_var()->index() - kFirstLocalSlotFromFp);
+      args_desc_slot = FrameSlotForVariable(parsed_function().arg_desc_var());
     }
 
     __ Comment("Initialize spill slots");
-    if (num_locals > 1 || (num_locals == 1 && args_desc_index == -1)) {
+    if (num_locals > 1 || (num_locals == 1 && args_desc_slot == -1)) {
       __ LoadObject(R0, Object::null_object());
     }
     for (intptr_t i = 0; i < num_locals; ++i) {
-      Register value_reg = i == args_desc_index ? ARGS_DESC_REG : R0;
-      __ StoreToOffset(value_reg, FP, (kFirstLocalSlotFromFp - i) * kWordSize);
+      const intptr_t slot_index = FrameSlotForVariableIndex(-i);
+      Register value_reg = slot_index == args_desc_slot ? ARGS_DESC_REG : R0;
+      __ StoreToOffset(value_reg, FP, slot_index * kWordSize);
     }
   }
 
@@ -1059,7 +1059,7 @@
     TokenPosition token_pos,
     intptr_t deopt_id) {
   if (needs_number_check) {
-    ASSERT(!obj.IsMint() && !obj.IsDouble() && !obj.IsBigint());
+    ASSERT(!obj.IsMint() && !obj.IsDouble());
     __ Push(reg);
     __ PushObject(obj);
     if (is_optimizing()) {
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc b/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc
index 557f69a..1d6c20e 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc
@@ -108,7 +108,9 @@
 
   if (lazy_deopt_with_result_) {
     ASSERT(reason() == ICData::kDeoptAtCall);
-    builder->AddCopy(NULL, Location::StackSlot(stack_height), slot_ix++);
+    builder->AddCopy(
+        NULL, Location::StackSlot(FrameSlotForVariableIndex(-stack_height)),
+        slot_ix++);
   }
 
   // For the innermost environment, set outgoing arguments and the locals.
@@ -327,10 +329,10 @@
     if (parsed_function().has_arg_desc_var()) {
       // TODO(kustermann): If dbc simulator put the args_desc_ into the
       // _special_regs, we could replace these 3 with the MoveSpecial bytecode.
-      const intptr_t args_desc_index =
-          -(parsed_function().arg_desc_var()->index() - kFirstLocalSlotFromFp);
+      const intptr_t slot_index =
+          FrameSlotForVariable(parsed_function().arg_desc_var());
       __ LoadArgDescriptor();
-      __ StoreLocal(args_desc_index);
+      __ StoreLocal(LocalVarIndex(0, slot_index));
       __ Drop(1);
     }
   }
@@ -357,16 +359,6 @@
   return static_cast<uint16_t>(cid);
 }
 
-intptr_t FlowGraphCompiler::CatchEntryRegForVariable(const LocalVariable& var) {
-  const Function& function = parsed_function().function();
-  const intptr_t num_non_copied_params =
-      function.HasOptionalParameters() ? 0 : function.NumParameters();
-
-  ASSERT(is_optimizing());
-  ASSERT(var.index() <= 0);
-  return kNumberOfCpuRegisters - (num_non_copied_params - var.index());
-}
-
 #undef __
 #define __ compiler_->assembler()->
 
@@ -375,10 +367,11 @@
   const Location source = move->src();
   const Location destination = move->dest();
   if (source.IsStackSlot() && destination.IsRegister()) {
-    // Only allow access to the arguments.
+    // Only allow access to the arguments (which have in the non-inverted stack
+    // positive indices).
     ASSERT(source.base_reg() == FPREG);
-    ASSERT(source.stack_index() < 0);
-    __ Move(destination.reg(), -kParamEndSlotFromFp + source.stack_index());
+    ASSERT(source.stack_index() > kParamEndSlotFromFp);
+    __ Move(destination.reg(), -source.stack_index());
   } else if (source.IsRegister() && destination.IsRegister()) {
     __ Move(destination.reg(), source.reg());
   } else if (source.IsArgsDescRegister()) {
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
index f19eea3..6e4f305 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
@@ -364,7 +364,7 @@
     __ jmp(is_not_instance_lbl);
     return false;
   }
-  // Custom checking for numbers (Smi, Mint, Bigint and Double).
+  // Custom checking for numbers (Smi, Mint and Double).
   // Note that instance is not Smi (checked above).
   if (type.IsNumberType() || type.IsIntType() || type.IsDoubleType()) {
     GenerateNumberTypeCheck(kClassIdReg, type, is_instance_lbl,
@@ -786,21 +786,21 @@
   if (!is_optimizing()) {
     const int num_locals = parsed_function().num_stack_locals();
 
-    intptr_t args_desc_index = -1;
+    intptr_t args_desc_slot = -1;
     if (parsed_function().has_arg_desc_var()) {
-      args_desc_index =
-          -(parsed_function().arg_desc_var()->index() - kFirstLocalSlotFromFp);
+      args_desc_slot = FrameSlotForVariable(parsed_function().arg_desc_var());
     }
 
     __ Comment("Initialize spill slots");
-    if (num_locals > 1 || args_desc_index != 0) {
+    if (num_locals > 1 || (num_locals == 1 && args_desc_slot == -1)) {
       const Immediate& raw_null =
           Immediate(reinterpret_cast<intptr_t>(Object::null()));
       __ movl(EAX, raw_null);
     }
     for (intptr_t i = 0; i < num_locals; ++i) {
-      Register value_reg = i == args_desc_index ? ARGS_DESC_REG : EAX;
-      __ movl(Address(EBP, (kFirstLocalSlotFromFp - i) * kWordSize), value_reg);
+      const intptr_t slot_index = FrameSlotForVariableIndex(-i);
+      Register value_reg = slot_index == args_desc_slot ? ARGS_DESC_REG : EAX;
+      __ movl(Address(EBP, slot_index * kWordSize), value_reg);
     }
   }
 
@@ -977,8 +977,7 @@
     bool needs_number_check,
     TokenPosition token_pos,
     intptr_t deopt_id) {
-  ASSERT(!needs_number_check ||
-         (!obj.IsMint() && !obj.IsDouble() && !obj.IsBigint()));
+  ASSERT(!needs_number_check || (!obj.IsMint() && !obj.IsDouble()));
 
   if (obj.IsSmi() && (Smi::Cast(obj).Value() == 0)) {
     ASSERT(!needs_number_check);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index 0ef54a5..6a91d21 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -362,7 +362,7 @@
     __ jmp(is_not_instance_lbl);
     return false;
   }
-  // Custom checking for numbers (Smi, Mint, Bigint and Double).
+  // Custom checking for numbers (Smi, Mint and Double).
   // Note that instance is not Smi (checked above).
   if (type.IsNumberType() || type.IsIntType() || type.IsDoubleType()) {
     GenerateNumberTypeCheck(kClassIdReg, type, is_instance_lbl,
@@ -828,19 +828,19 @@
   if (!is_optimizing()) {
     const int num_locals = parsed_function().num_stack_locals();
 
-    intptr_t args_desc_index = -1;
+    intptr_t args_desc_slot = -1;
     if (parsed_function().has_arg_desc_var()) {
-      args_desc_index =
-          -(parsed_function().arg_desc_var()->index() - kFirstLocalSlotFromFp);
+      args_desc_slot = FrameSlotForVariable(parsed_function().arg_desc_var());
     }
 
     __ Comment("Initialize spill slots");
-    if (num_locals > 1 || (num_locals == 1 && args_desc_index == -1)) {
+    if (num_locals > 1 || (num_locals == 1 && args_desc_slot == -1)) {
       __ LoadObject(RAX, Object::null_object());
     }
     for (intptr_t i = 0; i < num_locals; ++i) {
-      Register value_reg = i == args_desc_index ? ARGS_DESC_REG : RAX;
-      __ movq(Address(RBP, (kFirstLocalSlotFromFp - i) * kWordSize), value_reg);
+      const intptr_t slot_index = FrameSlotForVariableIndex(-i);
+      Register value_reg = slot_index == args_desc_slot ? ARGS_DESC_REG : RAX;
+      __ movq(Address(RBP, slot_index * kWordSize), value_reg);
     }
   }
 
@@ -1050,8 +1050,7 @@
     bool needs_number_check,
     TokenPosition token_pos,
     intptr_t deopt_id) {
-  ASSERT(!needs_number_check ||
-         (!obj.IsMint() && !obj.IsDouble() && !obj.IsBigint()));
+  ASSERT(!needs_number_check || (!obj.IsMint() && !obj.IsDouble()));
 
   if (obj.IsSmi() && (Smi::Cast(obj).Value() == 0)) {
     ASSERT(!needs_number_check);
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index ce25835a..1b2910b 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -739,8 +739,6 @@
 ConstantInstr::ConstantInstr(const Object& value, TokenPosition token_pos)
     : value_(value), token_pos_(token_pos) {
   // Check that the value is not an incorrect Integer representation.
-  ASSERT(!value.IsBigint() || !Bigint::Cast(value).FitsIntoSmi());
-  ASSERT(!value.IsBigint() || !Bigint::Cast(value).FitsIntoInt64());
   ASSERT(!value.IsMint() || !Smi::IsValid(Mint::Cast(value).AsInt64Value()));
   ASSERT(!value.IsField() || Field::Cast(value).IsOriginal());
 }
@@ -1505,7 +1503,6 @@
   } else if (is_truncating() && value()->definition()->IsBoxInteger()) {
     return false;
   } else if ((kSmiBits < 32) && value()->Type()->IsInt()) {
-    // Note: we don't support truncation of Bigint values.
     return !RangeUtils::Fits(value()->definition()->range(),
                              RangeBoundary::kRangeBoundaryInt32);
   } else {
@@ -2003,7 +2000,6 @@
   if ((left_type->ToCid() == kSmiCid) && (right_type->ToCid() == kSmiCid)) {
     op_cid = kSmiCid;
   } else if (Isolate::Current()->strong() && FLAG_use_strong_mode_types &&
-             FLAG_limit_ints_to_64_bits &&
              FlowGraphCompiler::SupportsUnboxedInt64() &&
              // TODO(dartbug.com/30480): handle nullable types here
              left_type->IsNullableInt() && !left_type->is_nullable() &&
@@ -2688,8 +2684,7 @@
 }
 
 static bool MayBeBoxableNumber(intptr_t cid) {
-  return (cid == kDynamicCid) || (cid == kMintCid) || (cid == kBigintCid) ||
-         (cid == kDoubleCid);
+  return (cid == kDynamicCid) || (cid == kMintCid) || (cid == kDoubleCid);
 }
 
 static bool MaybeNumber(CompileType* type) {
@@ -2708,7 +2703,7 @@
                                              bool* negated,
                                              bool is_branch) {
   // Use propagated cid and type information to eliminate number checks.
-  // If one of the inputs is not a boxable number (Mint, Double, Bigint), or
+  // If one of the inputs is not a boxable number (Mint, Double), or
   // is not a subtype of num, no need for number checks.
   if (compare->needs_number_check()) {
     if (!MayBeBoxableNumber(compare->left()->Type()->ToCid()) ||
@@ -4122,7 +4117,6 @@
         break;
 
       case kUnboxedInt64: {
-        ASSERT(FLAG_limit_ints_to_64_bits);
         if (value()->Type()->ToCid() == kSmiCid) {
           // Smi -> int64 conversion is more efficient than
           // handling arbitrary smi/mint.
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 4806355..3ce1bb1 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -177,7 +177,7 @@
 
   // Returns true if value of this type is either int or null.
   bool IsNullableInt() {
-    if ((cid_ == kSmiCid) || (cid_ == kMintCid) || (cid_ == kBigintCid)) {
+    if ((cid_ == kSmiCid) || (cid_ == kMintCid)) {
       return true;
     }
     if ((cid_ == kIllegalCid) || (cid_ == kDynamicCid)) {
@@ -3426,7 +3426,7 @@
   PRINT_OPERANDS_TO_SUPPORT
 
  private:
-  // True if the comparison must check for double, Mint or Bigint and
+  // True if the comparison must check for double or Mint and
   // use value comparison instead.
   bool needs_number_check_;
 
@@ -6214,28 +6214,17 @@
                      SpeculativeMode speculative_mode = kGuardInputs)
       : BinaryIntegerOpInstr(op_kind, left, right, deopt_id),
         speculative_mode_(speculative_mode) {
-    if (FLAG_limit_ints_to_64_bits) {
-      mark_truncating();
-    }
+    mark_truncating();
   }
 
   virtual bool ComputeCanDeoptimize() const {
-    switch (op_kind()) {
-      case Token::kADD:
-      case Token::kSUB:
-        return can_overflow();
-      case Token::kMUL:
-// Note that ARM64 does not support operations with unboxed mints,
-// so it is not handled here.
-#if defined(TARGET_ARCH_X64)
-        return can_overflow();  // Deopt if overflow.
-#else
-        // IA32, ARM
-        return true;  // Deopt if inputs are not int32.
-#endif
-      default:
-        return false;
+    ASSERT(!can_overflow());
+#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_ARM)
+    if (op_kind() == Token::kMUL) {
+      return true;  // Deopt if inputs are not int32.
     }
+#endif
+    return false;
   }
 
   virtual Representation representation() const { return kUnboxedInt64; }
@@ -6271,16 +6260,14 @@
       : BinaryIntegerOpInstr(op_kind, left, right, deopt_id),
         shift_range_(NULL) {
     ASSERT((op_kind == Token::kSHR) || (op_kind == Token::kSHL));
-    if (FLAG_limit_ints_to_64_bits) {
-      mark_truncating();
-    }
+    mark_truncating();
   }
 
   Range* shift_range() const { return shift_range_; }
 
   virtual bool ComputeCanDeoptimize() const {
-    return (!IsShiftCountInRange()) ||
-           (can_overflow() && (op_kind() == Token::kSHL));
+    ASSERT(!can_overflow());
+    return !IsShiftCountInRange();
   }
 
   virtual Representation representation() const { return kUnboxedInt64; }
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index e9a04e7..269f1b4 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -294,7 +294,7 @@
 
 void LoadLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register result = locs()->out(0).reg();
-  __ LoadFromOffset(kWord, result, FP, local().index() * kWordSize);
+  __ LoadFromOffset(kWord, result, FP, FrameOffsetInBytesForVariable(&local()));
 }
 
 LocationSummary* StoreLocalInstr::MakeLocationSummary(Zone* zone,
@@ -307,7 +307,7 @@
   const Register value = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
   ASSERT(result == value);  // Assert that register assignment is correct.
-  __ StoreToOffset(kWord, value, FP, local().index() * kWordSize);
+  __ StoreToOffset(kWord, value, FP, FrameOffsetInBytesForVariable(&local()));
 }
 
 LocationSummary* ConstantInstr::MakeLocationSummary(Zone* zone,
@@ -2912,11 +2912,11 @@
   if (!compiler->is_optimizing()) {
     if (raw_exception_var_ != nullptr) {
       __ StoreToOffset(kWord, kExceptionObjectReg, FP,
-                       raw_exception_var_->index() * kWordSize);
+                       FrameOffsetInBytesForVariable(raw_exception_var_));
     }
     if (raw_stacktrace_var_ != nullptr) {
       __ StoreToOffset(kWord, kStackTraceObjectReg, FP,
-                       raw_stacktrace_var_->index() * kWordSize);
+                       FrameOffsetInBytesForVariable(raw_stacktrace_var_));
     }
   }
 }
@@ -5750,6 +5750,7 @@
   PairLocation* out_pair = locs()->out(0).AsPairLocation();
   Register out_lo = out_pair->At(0).reg();
   Register out_hi = out_pair->At(1).reg();
+  ASSERT(!can_overflow());
 
   Label* deopt = NULL;
   if (CanDeoptimize()) {
@@ -5781,10 +5782,6 @@
         __ subs(out_lo, left_lo, Operand(right_lo));
         __ sbcs(out_hi, left_hi, Operand(right_hi));
       }
-      if (can_overflow()) {
-        // Deopt on overflow.
-        __ b(deopt, VS);
-      }
       break;
     }
     case Token::kMUL: {
@@ -5824,6 +5821,7 @@
   PairLocation* out_pair = locs()->out(0).AsPairLocation();
   Register out_lo = out_pair->At(0).reg();
   Register out_hi = out_pair->At(1).reg();
+  ASSERT(!can_overflow());
 
   Label* deopt = NULL;
   if (CanDeoptimize()) {
@@ -5866,22 +5864,6 @@
           }
           __ mov(out_lo, Operand(0));
         }
-        // Check for overflow.
-        if (can_overflow()) {
-          // Compare high word from input with shifted high word from output.
-          // If shift > 32, also compare low word from input with high word from
-          // output shifted back shift - 32.
-          if (shift > 32) {
-            __ cmp(left_lo, Operand(out_hi, ASR, shift - 32));
-            __ cmp(left_hi, Operand(out_hi, ASR, 31), EQ);
-          } else if (shift == 32) {
-            __ cmp(left_hi, Operand(out_hi, ASR, 31));
-          } else {
-            __ cmp(left_hi, Operand(out_hi, ASR, shift));
-          }
-          // Overflow if they aren't equal.
-          __ b(deopt, NE);
-        }
         break;
       }
       default:
@@ -5917,19 +5899,6 @@
         __ mov(out_hi, Operand(left_hi, LSL, shift), PL);
         __ orr(out_hi, out_hi, Operand(left_lo, LSR, IP), PL);
         __ mov(out_lo, Operand(left_lo, LSL, shift));
-
-        // Check for overflow.
-        if (can_overflow()) {
-          // If shift > 32, compare low word from input with high word from
-          // output shifted back shift - 32.
-          __ mov(IP, Operand(out_hi, ASR, IP), MI);
-          __ mov(IP, Operand(left_lo), PL);  // No test if shift <= 32.
-          __ cmp(left_lo, Operand(IP));
-          // Compare high word from input with shifted high word from output.
-          __ cmp(left_hi, Operand(out_hi, ASR, shift), EQ);
-          // Overflow if they aren't equal.
-          __ b(deopt, NE);
-        }
         break;
       }
       default:
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 204dd69..d8bbde3 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -291,7 +291,7 @@
 
 void LoadLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register result = locs()->out(0).reg();
-  __ LoadFromOffset(result, FP, local().index() * kWordSize);
+  __ LoadFromOffset(result, FP, FrameOffsetInBytesForVariable(&local()));
 }
 
 LocationSummary* StoreLocalInstr::MakeLocationSummary(Zone* zone,
@@ -304,7 +304,7 @@
   const Register value = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
   ASSERT(result == value);  // Assert that register assignment is correct.
-  __ StoreToOffset(value, FP, local().index() * kWordSize);
+  __ StoreToOffset(value, FP, FrameOffsetInBytesForVariable(&local()));
 }
 
 LocationSummary* ConstantInstr::MakeLocationSummary(Zone* zone,
@@ -2659,11 +2659,11 @@
   if (!compiler->is_optimizing()) {
     if (raw_exception_var_ != nullptr) {
       __ StoreToOffset(kExceptionObjectReg, FP,
-                       raw_exception_var_->index() * kWordSize);
+                       FrameOffsetInBytesForVariable(raw_exception_var_));
     }
     if (raw_stacktrace_var_ != nullptr) {
       __ StoreToOffset(kStackTraceObjectReg, FP,
-                       raw_stacktrace_var_->index() * kWordSize);
+                       FrameOffsetInBytesForVariable(raw_stacktrace_var_));
     }
   }
 }
@@ -4988,10 +4988,8 @@
 }
 
 void BinaryInt64OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = NULL;
-  if (CanDeoptimize()) {
-    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
-  }
+  ASSERT(!can_overflow());
+  ASSERT(!CanDeoptimize());
 
   const Register left = locs()->in(0).reg();
   const Location right = locs()->in(1);
@@ -5008,12 +5006,6 @@
       r = right.reg();
     }
     __ mul(out, left, r);
-    if (CanDeoptimize()) {
-      __ smulh(TMP, left, r);
-      // TMP: result bits 64..127.
-      __ cmp(TMP, Operand(out, ASR, 63));
-      __ b(deopt, NE);
-    }
     return;
   }
 
@@ -5023,20 +5015,10 @@
         constant_instr->GetUnboxedSignedIntegerConstantValue();
     switch (op_kind()) {
       case Token::kADD:
-        if (CanDeoptimize()) {
-          __ AddImmediateSetFlags(out, left, value);
-          __ b(deopt, VS);
-        } else {
-          __ AddImmediate(out, left, value);
-        }
+        __ AddImmediate(out, left, value);
         break;
       case Token::kSUB:
-        if (CanDeoptimize()) {
-          __ SubImmediateSetFlags(out, left, value);
-          __ b(deopt, VS);
-        } else {
-          __ AddImmediate(out, left, -value);
-        }
+        __ AddImmediate(out, left, -value);
         break;
       case Token::kBIT_AND:
         __ AndImmediate(out, left, value);
@@ -5054,20 +5036,10 @@
     Operand r = Operand(right.reg());
     switch (op_kind()) {
       case Token::kADD:
-        if (CanDeoptimize()) {
-          __ adds(out, left, r);
-          __ b(deopt, VS);
-        } else {
-          __ add(out, left, r);
-        }
+        __ add(out, left, r);
         break;
       case Token::kSUB:
-        if (CanDeoptimize()) {
-          __ subs(out, left, r);
-          __ b(deopt, VS);
-        } else {
-          __ sub(out, left, r);
-        }
+        __ sub(out, left, r);
         break;
       case Token::kBIT_AND:
         __ and_(out, left, r);
@@ -5099,6 +5071,7 @@
 void ShiftInt64OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register left = locs()->in(0).reg();
   const Register out = locs()->out(0).reg();
+  ASSERT(!can_overflow());
 
   Label* deopt = NULL;
   if (CanDeoptimize()) {
@@ -5117,11 +5090,6 @@
       case Token::kSHL: {
         ASSERT(shift < 64);
         __ LslImmediate(out, left, shift);
-        // Check for overflow.
-        if (can_overflow()) {
-          __ cmp(left, Operand(out, ASR, shift));
-          __ b(deopt, NE);
-        }
         break;
       }
       default:
@@ -5147,13 +5115,6 @@
       }
       case Token::kSHL: {
         __ lslv(out, left, TMP);
-
-        // Check for overflow.
-        if (can_overflow()) {
-          __ asrv(TMP2, out, TMP);
-          __ cmp(left, Operand(TMP2));
-          __ b(deopt, NE);
-        }
         break;
       }
       default:
diff --git a/runtime/vm/compiler/backend/il_dbc.cc b/runtime/vm/compiler/backend/il_dbc.cc
index c00e4e9..0451944 100644
--- a/runtime/vm/compiler/backend/il_dbc.cc
+++ b/runtime/vm/compiler/backend/il_dbc.cc
@@ -328,19 +328,17 @@
 
 EMIT_NATIVE_CODE(LoadLocal, 0) {
   ASSERT(!compiler->is_optimizing());
-  ASSERT(local().index() != 0);
-  __ Push((local().index() > 0) ? (-local().index()) : (-local().index() - 1));
+  const intptr_t slot_index = FrameSlotForVariable(&local());
+  __ Push(LocalVarIndex(0, slot_index));
 }
 
 EMIT_NATIVE_CODE(StoreLocal, 0) {
   ASSERT(!compiler->is_optimizing());
-  ASSERT(local().index() != 0);
+  const intptr_t slot_index = FrameSlotForVariable(&local());
   if (HasTemp()) {
-    __ StoreLocal((local().index() > 0) ? (-local().index())
-                                        : (-local().index() - 1));
+    __ StoreLocal(LocalVarIndex(0, slot_index));
   } else {
-    __ PopLocal((local().index() > 0) ? (-local().index())
-                                      : (-local().index() - 1));
+    __ PopLocal(LocalVarIndex(0, slot_index));
   }
 }
 
@@ -1188,12 +1186,13 @@
 
   if (!compiler->is_optimizing()) {
     if (raw_exception_var_ != nullptr) {
-      __ MoveSpecial(LocalVarIndex(0, raw_exception_var_->index()),
+      __ MoveSpecial(LocalVarIndex(0, FrameSlotForVariable(raw_exception_var_)),
                      Simulator::kExceptionSpecialIndex);
     }
     if (raw_stacktrace_var_ != nullptr) {
-      __ MoveSpecial(LocalVarIndex(0, raw_stacktrace_var_->index()),
-                     Simulator::kStackTraceSpecialIndex);
+      __ MoveSpecial(
+          LocalVarIndex(0, FrameSlotForVariable(raw_stacktrace_var_)),
+          Simulator::kStackTraceSpecialIndex);
     }
   }
 }
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index e8ec6e3..e400614 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -134,9 +134,7 @@
 LocationSummary* LoadLocalInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 0;
-  const intptr_t stack_index = (local().index() < 0)
-                                   ? kFirstLocalSlotFromFp - local().index()
-                                   : kParamEndSlotFromFp - local().index();
+  const intptr_t stack_index = FrameSlotForVariable(&local());
   return LocationSummary::Make(zone, kNumInputs,
                                Location::StackSlot(stack_index),
                                LocationSummary::kNoCall);
@@ -158,7 +156,7 @@
   Register value = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
   ASSERT(result == value);  // Assert that register assignment is correct.
-  __ movl(Address(EBP, local().index() * kWordSize), value);
+  __ movl(Address(EBP, FrameOffsetInBytesForVariable(&local())), value);
 }
 
 LocationSummary* ConstantInstr::MakeLocationSummary(Zone* zone,
@@ -2498,11 +2496,11 @@
 
   if (!compiler->is_optimizing()) {
     if (raw_exception_var_ != nullptr) {
-      __ movl(Address(EBP, raw_exception_var_->index() * kWordSize),
+      __ movl(Address(EBP, FrameOffsetInBytesForVariable(raw_exception_var_)),
               kExceptionObjectReg);
     }
     if (raw_stacktrace_var_ != nullptr) {
-      __ movl(Address(EBP, raw_stacktrace_var_->index() * kWordSize),
+      __ movl(Address(EBP, FrameOffsetInBytesForVariable(raw_stacktrace_var_)),
               kStackTraceObjectReg);
     }
   }
@@ -5193,6 +5191,7 @@
   Register out_hi = out_pair->At(1).reg();
   ASSERT(out_lo == left_lo);
   ASSERT(out_hi == left_hi);
+  ASSERT(!can_overflow());
 
   Label* deopt = NULL;
   if (CanDeoptimize()) {
@@ -5220,9 +5219,6 @@
         __ subl(left_lo, right_lo);
         __ sbbl(left_hi, right_hi);
       }
-      if (can_overflow()) {
-        __ j(OVERFLOW, deopt);
-      }
       break;
     }
     case Token::kMUL: {
@@ -5253,17 +5249,12 @@
 LocationSummary* ShiftInt64OpInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
-  const intptr_t kNumTemps =
-      (op_kind() == Token::kSHL) && CanDeoptimize() ? 2 : 0;
+  const intptr_t kNumTemps = 0;
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
-  if ((op_kind() == Token::kSHL) && CanDeoptimize()) {
-    summary->set_temp(0, Location::RequiresRegister());
-    summary->set_temp(1, Location::RequiresRegister());
-  }
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
 }
@@ -5277,6 +5268,7 @@
   Register out_hi = out_pair->At(1).reg();
   ASSERT(out_lo == left_lo);
   ASSERT(out_hi == left_hi);
+  ASSERT(!can_overflow());
 
   Label* deopt = NULL;
   if (CanDeoptimize()) {
@@ -5303,51 +5295,15 @@
       }
       case Token::kSHL: {
         ASSERT(shift < 64);
-        if (can_overflow()) {
-          Register temp1 = locs()->temp(0).reg();
-          Register temp2 = locs()->temp(1).reg();
-          __ movl(temp1, left_hi);  // Preserve high 32 bits.
-          if (shift > 31) {
-            __ movl(left_hi, left_lo);  // Shift by 32.
-            if (shift > 32) {
-              __ shll(left_hi, Immediate(shift - 32));
-            }
-            // Check for overflow by sign extending the high 32 bits
-            // and comparing with the input.
-            __ movl(temp2, left_hi);
-            __ sarl(temp2, Immediate(31));
-            __ cmpl(temp1, temp2);
-            __ j(NOT_EQUAL, deopt);
-            if (shift > 32) {
-              // Also compare low word from input with high word from
-              // output shifted back shift - 32.
-              __ movl(temp2, left_hi);
-              __ sarl(temp2, Immediate(shift - 32));
-              __ cmpl(left_lo, temp2);
-              __ j(NOT_EQUAL, deopt);
-            }
-            __ xorl(left_lo, left_lo);  // Zero left_lo.
-          } else {
-            __ shldl(left_hi, left_lo, Immediate(shift));
-            __ shll(left_lo, Immediate(shift));
-            // Check for overflow by shifting back the high 32 bits
-            // and comparing with the input.
-            __ movl(temp2, left_hi);
-            __ sarl(temp2, Immediate(shift));
-            __ cmpl(temp1, temp2);
-            __ j(NOT_EQUAL, deopt);
+        if (shift > 31) {
+          __ movl(left_hi, left_lo);  // Shift by 32.
+          __ xorl(left_lo, left_lo);  // Zero left_lo.
+          if (shift > 32) {
+            __ shll(left_hi, Immediate(shift - 32));
           }
         } else {
-          if (shift > 31) {
-            __ movl(left_hi, left_lo);  // Shift by 32.
-            __ xorl(left_lo, left_lo);  // Zero left_lo.
-            if (shift > 32) {
-              __ shll(left_hi, Immediate(shift - 32));
-            }
-          } else {
-            __ shldl(left_hi, left_lo, Immediate(shift));
-            __ shll(left_lo, Immediate(shift));
-          }
+          __ shldl(left_hi, left_lo, Immediate(shift));
+          __ shll(left_lo, Immediate(shift));
         }
         break;
       }
@@ -5382,54 +5338,18 @@
         break;
       }
       case Token::kSHL: {
-        if (can_overflow()) {
-          Register temp1 = locs()->temp(0).reg();
-          Register temp2 = locs()->temp(1).reg();
-          __ movl(temp1, left_hi);  // Preserve high 32 bits.
-          __ cmpl(ECX, Immediate(31));
-          __ j(ABOVE, &large_shift);
+        __ cmpl(ECX, Immediate(31));
+        __ j(ABOVE, &large_shift);
 
-          __ shldl(left_hi, left_lo, ECX);  // Shift count in CL.
-          __ shll(left_lo, ECX);            // Shift count in CL.
-          // Check for overflow by shifting back the high 32 bits
-          // and comparing with the input.
-          __ movl(temp2, left_hi);
-          __ sarl(temp2, ECX);
-          __ cmpl(temp1, temp2);
-          __ j(NOT_EQUAL, deopt);
-          __ jmp(&done, Assembler::kNearJump);
+        __ shldl(left_hi, left_lo, ECX);  // Shift count in CL.
+        __ shll(left_lo, ECX);            // Shift count in CL.
+        __ jmp(&done, Assembler::kNearJump);
 
-          __ Bind(&large_shift);
-          // No need to subtract 32 from CL, only 5 bits used by shll.
-          __ movl(left_hi, left_lo);  // Shift by 32.
-          __ shll(left_hi, ECX);      // Shift count: CL % 32.
-          // Check for overflow by sign extending the high 32 bits
-          // and comparing with the input.
-          __ movl(temp2, left_hi);
-          __ sarl(temp2, Immediate(31));
-          __ cmpl(temp1, temp2);
-          __ j(NOT_EQUAL, deopt);
-          // Also compare low word from input with high word from
-          // output shifted back shift - 32.
-          __ movl(temp2, left_hi);
-          __ sarl(temp2, ECX);  // Shift count: CL % 32.
-          __ cmpl(left_lo, temp2);
-          __ j(NOT_EQUAL, deopt);
-          __ xorl(left_lo, left_lo);  // Zero left_lo.
-        } else {
-          __ cmpl(ECX, Immediate(31));
-          __ j(ABOVE, &large_shift);
-
-          __ shldl(left_hi, left_lo, ECX);  // Shift count in CL.
-          __ shll(left_lo, ECX);            // Shift count in CL.
-          __ jmp(&done, Assembler::kNearJump);
-
-          __ Bind(&large_shift);
-          // No need to subtract 32 from CL, only 5 bits used by shll.
-          __ movl(left_hi, left_lo);  // Shift by 32.
-          __ xorl(left_lo, left_lo);  // Zero left_lo.
-          __ shll(left_hi, ECX);      // Shift count: CL % 32.
-        }
+        __ Bind(&large_shift);
+        // No need to subtract 32 from CL, only 5 bits used by shll.
+        __ movl(left_hi, left_lo);  // Shift by 32.
+        __ xorl(left_lo, left_lo);  // Zero left_lo.
+        __ shll(left_hi, ECX);      // Shift count: CL % 32.
         break;
       }
       default:
diff --git a/runtime/vm/compiler/backend/il_printer.cc b/runtime/vm/compiler/backend/il_printer.cc
index c77e7d6..44e1b37 100644
--- a/runtime/vm/compiler/backend/il_printer.cc
+++ b/runtime/vm/compiler/backend/il_printer.cc
@@ -563,11 +563,11 @@
 }
 
 void LoadLocalInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s @%d", local().name().ToCString(), local().index());
+  f->Print("%s @%d", local().name().ToCString(), local().index().value());
 }
 
 void StoreLocalInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s @%d, ", local().name().ToCString(), local().index());
+  f->Print("%s @%d, ", local().name().ToCString(), local().index().value());
   value()->PrintTo(f);
 }
 
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index aeb619b..2d410db 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -236,9 +236,7 @@
 LocationSummary* LoadLocalInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 0;
-  const intptr_t stack_index = (local().index() < 0)
-                                   ? kFirstLocalSlotFromFp - local().index()
-                                   : kParamEndSlotFromFp - local().index();
+  const intptr_t stack_index = FrameSlotForVariable(&local());
   return LocationSummary::Make(zone, kNumInputs,
                                Location::StackSlot(stack_index),
                                LocationSummary::kNoCall);
@@ -260,7 +258,7 @@
   Register value = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
   ASSERT(result == value);  // Assert that register assignment is correct.
-  __ movq(Address(RBP, local().index() * kWordSize), value);
+  __ movq(Address(RBP, FrameOffsetInBytesForVariable(&local())), value);
 }
 
 LocationSummary* ConstantInstr::MakeLocationSummary(Zone* zone,
@@ -2591,11 +2589,11 @@
 
   if (!compiler->is_optimizing()) {
     if (raw_exception_var_ != nullptr) {
-      __ movq(Address(RBP, raw_exception_var_->index() * kWordSize),
+      __ movq(Address(RBP, FrameOffsetInBytesForVariable(raw_exception_var_)),
               kExceptionObjectReg);
     }
     if (raw_stacktrace_var_ != nullptr) {
-      __ movq(Address(RBP, raw_stacktrace_var_->index() * kWordSize),
+      __ movq(Address(RBP, FrameOffsetInBytesForVariable(raw_stacktrace_var_)),
               kStackTraceObjectReg);
     }
   }
@@ -5153,8 +5151,7 @@
 static void EmitInt64Arithmetic(FlowGraphCompiler* compiler,
                                 Token::Kind op_kind,
                                 Register left,
-                                const OperandType& right,
-                                Label* deopt) {
+                                const OperandType& right) {
   switch (op_kind) {
     case Token::kADD:
       __ addq(left, right);
@@ -5177,7 +5174,6 @@
     default:
       UNREACHABLE();
   }
-  if (deopt != NULL) __ j(OVERFLOW, deopt);
 }
 
 LocationSummary* BinaryInt64OpInstr::MakeLocationSummary(Zone* zone,
@@ -5193,23 +5189,20 @@
 }
 
 void BinaryInt64OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = NULL;
-  if (CanDeoptimize()) {
-    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
-  }
   const Location left = locs()->in(0);
   const Location right = locs()->in(1);
   const Location out = locs()->out(0);
   ASSERT(out.reg() == left.reg());
+  ASSERT(!can_overflow());
+  ASSERT(!CanDeoptimize());
 
   if (right.IsConstant()) {
     ConstantInstr* constant_instr = right.constant_instruction();
     const int64_t value =
         constant_instr->GetUnboxedSignedIntegerConstantValue();
-    EmitInt64Arithmetic(compiler, op_kind(), left.reg(), Immediate(value),
-                        deopt);
+    EmitInt64Arithmetic(compiler, op_kind(), left.reg(), Immediate(value));
   } else {
-    EmitInt64Arithmetic(compiler, op_kind(), left.reg(), right.reg(), deopt);
+    EmitInt64Arithmetic(compiler, op_kind(), left.reg(), right.reg());
   }
 }
 
@@ -5235,14 +5228,11 @@
 LocationSummary* ShiftInt64OpInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
-  const intptr_t kNumTemps = can_overflow() ? 1 : 0;
+  const intptr_t kNumTemps = 0;
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
-  if (kNumTemps > 0) {
-    summary->set_temp(0, Location::RequiresRegister());
-  }
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
 }
@@ -5251,6 +5241,7 @@
   const Register left = locs()->in(0).reg();
   const Register out = locs()->out(0).reg();
   ASSERT(left == out);
+  ASSERT(!can_overflow());
 
   Label* deopt = NULL;
   if (CanDeoptimize()) {
@@ -5268,16 +5259,6 @@
         break;
       case Token::kSHL: {
         ASSERT(shift < 64);
-        if (can_overflow()) {
-          // Check for overflow.
-          Register temp = locs()->temp(0).reg();
-          __ movq(temp, left);
-          __ shlq(left, Immediate(shift));
-          __ sarq(left, Immediate(shift));
-          __ cmpq(left, temp);
-          __ j(NOT_EQUAL, deopt);  // Overflow.
-        }
-        // Shift for result now we know there is no overflow.
         __ shlq(left, Immediate(shift));
         break;
       }
@@ -5300,16 +5281,6 @@
         break;
       }
       case Token::kSHL: {
-        if (can_overflow()) {
-          // Check for overflow.
-          Register temp = locs()->temp(0).reg();
-          __ movq(temp, left);
-          __ shlq(left, RCX);
-          __ sarq(left, RCX);
-          __ cmpq(left, temp);
-          __ j(NOT_EQUAL, deopt);  // Overflow.
-        }
-        // Shift for result now we know there is no overflow.
         __ shlq(left, RCX);
         break;
       }
diff --git a/runtime/vm/compiler/backend/inliner.cc b/runtime/vm/compiler/backend/inliner.cc
index 5512de8..2643894 100644
--- a/runtime/vm/compiler/backend/inliner.cc
+++ b/runtime/vm/compiler/backend/inliner.cc
@@ -2856,16 +2856,10 @@
     str = new LoadUntaggedInstr(new Value(str),
                                 ExternalOneByteString::external_data_offset());
     cursor = flow_graph->AppendTo(cursor, str, NULL, FlowGraph::kValue);
-    str = new LoadUntaggedInstr(
-        new Value(str), RawExternalOneByteString::ExternalData::data_offset());
-    cursor = flow_graph->AppendTo(cursor, str, NULL, FlowGraph::kValue);
   } else if (cid == kExternalTwoByteStringCid) {
     str = new LoadUntaggedInstr(new Value(str),
                                 ExternalTwoByteString::external_data_offset());
     cursor = flow_graph->AppendTo(cursor, str, NULL, FlowGraph::kValue);
-    str = new LoadUntaggedInstr(
-        new Value(str), RawExternalTwoByteString::ExternalData::data_offset());
-    cursor = flow_graph->AppendTo(cursor, str, NULL, FlowGraph::kValue);
   }
 
   LoadIndexedInstr* load_indexed = new (Z) LoadIndexedInstr(
diff --git a/runtime/vm/compiler/backend/linearscan.cc b/runtime/vm/compiler/backend/linearscan.cc
index f96a09d..4b6a94d 100644
--- a/runtime/vm/compiler/backend/linearscan.cc
+++ b/runtime/vm/compiler/backend/linearscan.cc
@@ -39,7 +39,9 @@
 // SSA index to the second.
 static intptr_t ToSecondPairVreg(intptr_t vreg) {
   // Map vreg to its pair vreg.
-  return vreg + kPairVirtualRegisterOffset;
+  ASSERT((vreg == kNoVirtualRegister) || vreg >= 0);
+  return (vreg == kNoVirtualRegister) ? kNoVirtualRegister
+                                      : (vreg + kPairVirtualRegisterOffset);
 }
 
 static intptr_t MinPosition(intptr_t a, intptr_t b) {
@@ -446,7 +448,8 @@
             End());
   assigned_location().Print();
   if (spill_slot_.HasStackIndex()) {
-    intptr_t stack_slot = spill_slot_.stack_index();
+    const intptr_t stack_slot =
+        -VariableIndexForFrameSlot(spill_slot_.stack_index());
     THR_Print(" allocated spill slot: %" Pd "", stack_slot);
   }
   THR_Print("\n");
@@ -657,7 +660,6 @@
       return;
 #if defined(TARGET_ARCH_DBC)
     } else if (ParameterInstr* param = defn->AsParameter()) {
-      // This must be in sync with FlowGraphCompiler::CatchEntryRegForVariable.
       intptr_t slot_index = param->index();
       AssignSafepoints(defn, range);
       range->finger()->Initialize(range);
@@ -708,6 +710,9 @@
       return;
     }
 #endif  // defined(TARGET_ARCH_DBC)
+    if (param->base_reg() == FPREG) {
+      slot_index = FrameSlotForVariableIndex(-slot_index);
+    }
     range->set_assigned_location(
         Location::StackSlot(slot_index, param->base_reg()));
     range->set_spill_slot(Location::StackSlot(slot_index, param->base_reg()));
@@ -745,8 +750,9 @@
     CompleteRange(tail, Location::kRegister);
   }
   ConvertAllUses(range);
-  if (range->spill_slot().IsStackSlot() &&
-      (range->spill_slot().stack_index() >= 0)) {
+  Location spill_slot = range->spill_slot();
+  if (spill_slot.IsStackSlot() && spill_slot.base_reg() == FPREG &&
+      spill_slot.stack_index() <= kFirstLocalSlotFromFp) {
     // On entry to the function, range is stored on the stack above the FP in
     // the same space which is used for spill slots. Update spill slot state to
     // reflect that and prevent register allocator from reusing this space as a
@@ -2005,13 +2011,15 @@
 
   // Assign spill slot to the range.
   if (register_kind_ == Location::kRegister) {
-    range->set_spill_slot(Location::StackSlot(idx));
+    const intptr_t slot_index = FrameSlotForVariableIndex(-idx);
+    range->set_spill_slot(Location::StackSlot(slot_index));
   } else {
     // We use the index of the slot with the lowest address as an index for the
     // FPU register spill slot. In terms of indexes this relation is inverted:
     // so we have to take the highest index.
-    const intptr_t slot_idx = cpu_spill_slot_count_ + idx * kDoubleSpillFactor +
-                              (kDoubleSpillFactor - 1);
+    const intptr_t slot_idx = FrameSlotForVariableIndex(
+        -(cpu_spill_slot_count_ + idx * kDoubleSpillFactor +
+          (kDoubleSpillFactor - 1)));
 
     Location location;
     if ((range->representation() == kUnboxedFloat32x4) ||
@@ -2030,9 +2038,12 @@
 }
 
 void FlowGraphAllocator::MarkAsObjectAtSafepoints(LiveRange* range) {
-  intptr_t stack_index = range->spill_slot().stack_index();
+  Location spill_slot = range->spill_slot();
+  intptr_t stack_index = spill_slot.stack_index();
+  if (spill_slot.base_reg() == FPREG) {
+    stack_index = -VariableIndexForFrameSlot(spill_slot.stack_index());
+  }
   ASSERT(stack_index >= 0);
-
   while (range != NULL) {
     for (SafepointPosition* safepoint = range->first_safepoint();
          safepoint != NULL; safepoint = safepoint->next()) {
diff --git a/runtime/vm/compiler/backend/locations.cc b/runtime/vm/compiler/backend/locations.cc
index 44c88ee..f1435e5 100644
--- a/runtime/vm/compiler/backend/locations.cc
+++ b/runtime/vm/compiler/backend/locations.cc
@@ -112,37 +112,12 @@
 // DBC does not have an notion of 'address' in its instruction set.
 #if !defined(TARGET_ARCH_DBC)
 Address Location::ToStackSlotAddress() const {
-  const intptr_t index = stack_index();
-  const Register base = base_reg();
-  if (base == FPREG) {
-    if (index < 0) {
-      const intptr_t offset = (kParamEndSlotFromFp - index) * kWordSize;
-      return Address(base, offset);
-    } else {
-      const intptr_t offset = (kFirstLocalSlotFromFp - index) * kWordSize;
-      return Address(base, offset);
-    }
-  } else {
-    ASSERT(base == SPREG);
-    return Address(base, index * kWordSize);
-  }
+  return Address(base_reg(), ToStackSlotOffset());
 }
 #endif
 
 intptr_t Location::ToStackSlotOffset() const {
-  const intptr_t index = stack_index();
-  if (base_reg() == FPREG) {
-    if (index < 0) {
-      const intptr_t offset = (kParamEndSlotFromFp - index) * kWordSize;
-      return offset;
-    } else {
-      const intptr_t offset = (kFirstLocalSlotFromFp - index) * kWordSize;
-      return offset;
-    }
-  } else {
-    ASSERT(base_reg() == SPREG);
-    return index * kWordSize;
-  }
+  return stack_index() * kWordSize;
 }
 
 const Object& Location::constant() const {
@@ -257,18 +232,18 @@
   if (IsRegister()) {
     intptr_t index = cpu_reg_slots[reg()];
     ASSERT(index >= 0);
-    return Location::StackSlot(index);
+    return Location::StackSlot(FrameSlotForVariableIndex(-index));
   } else if (IsFpuRegister()) {
     intptr_t index = fpu_reg_slots[fpu_reg()];
     ASSERT(index >= 0);
     switch (def->representation()) {
       case kUnboxedDouble:
-        return Location::DoubleStackSlot(index);
+        return Location::DoubleStackSlot(FrameSlotForVariableIndex(-index));
 
       case kUnboxedFloat32x4:
       case kUnboxedInt32x4:
       case kUnboxedFloat64x2:
-        return Location::QuadStackSlot(index);
+        return Location::QuadStackSlot(FrameSlotForVariableIndex(-index));
 
       default:
         UNREACHABLE();
@@ -280,14 +255,16 @@
     intptr_t index_hi;
 
     if (value_pair->At(0).IsRegister()) {
-      index_lo = cpu_reg_slots[value_pair->At(0).reg()];
+      index_lo =
+          FrameSlotForVariableIndex(-cpu_reg_slots[value_pair->At(0).reg()]);
     } else {
       ASSERT(value_pair->At(0).IsStackSlot());
       index_lo = value_pair->At(0).stack_index();
     }
 
     if (value_pair->At(1).IsRegister()) {
-      index_hi = cpu_reg_slots[value_pair->At(1).reg()];
+      index_hi =
+          FrameSlotForVariableIndex(-cpu_reg_slots[value_pair->At(1).reg()]);
     } else {
       ASSERT(value_pair->At(1).IsStackSlot());
       index_hi = value_pair->At(1).stack_index();
diff --git a/runtime/vm/compiler/backend/locations.h b/runtime/vm/compiler/backend/locations.h
index fd4d576..ec6ab97 100644
--- a/runtime/vm/compiler/backend/locations.h
+++ b/runtime/vm/compiler/backend/locations.h
@@ -327,7 +327,6 @@
     return static_cast<uword>(kStackIndexBias + stack_index);
   }
 
-  // Spill slots.
   static Location StackSlot(intptr_t stack_index, Register base = FPREG) {
     uword payload = StackSlotBaseField::encode(base) |
                     StackIndexField::encode(EncodeStackIndex(stack_index));
diff --git a/runtime/vm/compiler/backend/range_analysis.cc b/runtime/vm/compiler/backend/range_analysis.cc
index 0a01b69..b39e2be 100644
--- a/runtime/vm/compiler/backend/range_analysis.cc
+++ b/runtime/vm/compiler/backend/range_analysis.cc
@@ -460,10 +460,6 @@
     // However the definition itself is not a int-definition and
     // thus it will never have range assigned to it. Just return the widest
     // range possible for this value.
-    // It is safe to return Int64 range as this is the widest possible range
-    // supported by our unboxing operations - if this definition produces
-    // Bigint outside of Int64 we will deoptimize whenever we actually try
-    // to unbox it.
     // Note: that we can't return NULL here because it is used as lattice's
     // bottom element to indicate that the range was not computed *yet*.
     return &int64_range_;
diff --git a/runtime/vm/compiler/backend/range_analysis.h b/runtime/vm/compiler/backend/range_analysis.h
index 33f53b6..e8140f8 100644
--- a/runtime/vm/compiler/backend/range_analysis.h
+++ b/runtime/vm/compiler/backend/range_analysis.h
@@ -64,12 +64,9 @@
   static RangeBoundary FromDefinition(Definition* defn, int64_t offs = 0);
 
   static bool IsValidOffsetForSymbolicRangeBoundary(int64_t offset) {
-    if (FLAG_limit_ints_to_64_bits) {
-      if ((offset > (kMaxInt64 - kSmiMax)) ||
-          (offset < (kMinInt64 - kSmiMin))) {
-        // Avoid creating symbolic range boundaries which can wrap around.
-        return false;
-      }
+    if ((offset > (kMaxInt64 - kSmiMax)) || (offset < (kMinInt64 - kSmiMin))) {
+      // Avoid creating symbolic range boundaries which can wrap around.
+      return false;
     }
     return true;
   }
@@ -297,8 +294,7 @@
   Range(RangeBoundary min, RangeBoundary max) : min_(min), max_(max) {
     ASSERT(min_.IsUnknown() == max_.IsUnknown());
 
-    if (FLAG_limit_ints_to_64_bits &&
-        (min_.IsInfinity() || max_.IsInfinity())) {
+    if (min_.IsInfinity() || max_.IsInfinity()) {
       // Value can wrap around, so fall back to the full 64-bit range.
       SetInt64Range();
     }
@@ -342,7 +338,7 @@
   void set_min(const RangeBoundary& value) {
     min_ = value;
 
-    if (FLAG_limit_ints_to_64_bits && min_.IsInfinity()) {
+    if (min_.IsInfinity()) {
       // Value can wrap around, so fall back to the full 64-bit range.
       SetInt64Range();
     }
@@ -351,7 +347,7 @@
   void set_max(const RangeBoundary& value) {
     max_ = value;
 
-    if (FLAG_limit_ints_to_64_bits && max_.IsInfinity()) {
+    if (max_.IsInfinity()) {
       // Value can wrap around, so fall back to the full 64-bit range.
       SetInt64Range();
     }
@@ -529,10 +525,6 @@
   // inference.
   // Returns meaningful results for uses of non-smi/non-int definitions that
   // have smi/int as a reaching type.
-  // For Int typed definitions we use full Int64 range as a safe approximation
-  // even though they might contain Bigint values because we only support
-  // 64-bit operations in the optimized code - which means that Bigint will
-  // cause deoptimization.
   const Range* GetSmiRange(Value* value) const;
   const Range* GetIntRange(Value* value) const;
 
diff --git a/runtime/vm/compiler/backend/range_analysis_test.cc b/runtime/vm/compiler/backend/range_analysis_test.cc
index 081c7e8..52c8694 100644
--- a/runtime/vm/compiler/backend/range_analysis_test.cc
+++ b/runtime/vm/compiler/backend/range_analysis_test.cc
@@ -106,42 +106,27 @@
 
   Range* all = new Range(RangeBoundary::NegativeInfinity(),
                          RangeBoundary::PositiveInfinity());
-  if (FLAG_limit_ints_to_64_bits) {
-    EXPECT(all->Equals(&fullInt64Range));
-  }
+  EXPECT(all->Equals(&fullInt64Range));
   EXPECT(all->Overlaps(0, 0));
   EXPECT(all->Overlaps(-1, 1));
   EXPECT(!all->IsWithin(0, 100));
 
   Range* positive = new Range(RangeBoundary::FromConstant(0),
                               RangeBoundary::PositiveInfinity());
-  if (FLAG_limit_ints_to_64_bits) {
-    EXPECT(positive->Equals(&fullInt64Range));
-  } else {
-    EXPECT(positive->IsPositive());
-    EXPECT(!positive->Overlaps(-2, -1));
-  }
+  EXPECT(positive->Equals(&fullInt64Range));
   EXPECT(positive->Overlaps(0, 1));
   EXPECT(positive->Overlaps(1, 100));
   EXPECT(positive->Overlaps(-1, 0));
 
   Range* negative = new Range(RangeBoundary::NegativeInfinity(),
                               RangeBoundary::FromConstant(-1));
-  if (FLAG_limit_ints_to_64_bits) {
-    EXPECT(positive->Equals(&fullInt64Range));
-  } else {
-    EXPECT(!negative->IsPositive());
-    EXPECT(!negative->Overlaps(0, 1));
-    EXPECT(!negative->Overlaps(1, 100));
-  }
+  EXPECT(positive->Equals(&fullInt64Range));
   EXPECT(negative->Overlaps(-1, 0));
   EXPECT(negative->Overlaps(-2, -1));
 
   Range* negpos = new Range(RangeBoundary::NegativeInfinity(),
                             RangeBoundary::FromConstant(0));
-  if (FLAG_limit_ints_to_64_bits) {
-    EXPECT(negpos->Equals(&fullInt64Range));
-  }
+  EXPECT(negpos->Equals(&fullInt64Range));
   EXPECT(!negpos->IsPositive());
 
   Range* a = new Range(RangeBoundary::NegativeInfinity(),
@@ -153,53 +138,31 @@
   Range* c = new Range(RangeBoundary::NegativeInfinity(),
                        RangeBoundary::FromConstant(32));
 
-  if (FLAG_limit_ints_to_64_bits) {
-    EXPECT(a->Equals(&fullInt64Range));
-    EXPECT(b->Equals(&fullInt64Range));
-    EXPECT(c->Equals(&fullInt64Range));
-  } else {
-    EXPECT(a->OnlyLessThanOrEqualTo(31));
-    EXPECT(b->OnlyLessThanOrEqualTo(31));
-  }
+  EXPECT(a->Equals(&fullInt64Range));
+  EXPECT(b->Equals(&fullInt64Range));
+  EXPECT(c->Equals(&fullInt64Range));
   EXPECT(!c->OnlyLessThanOrEqualTo(31));
 
   Range* unsatisfiable = new Range(RangeBoundary::PositiveInfinity(),
                                    RangeBoundary::NegativeInfinity());
-  if (FLAG_limit_ints_to_64_bits) {
-    EXPECT(unsatisfiable->Equals(&fullInt64Range));
-  } else {
-    EXPECT(unsatisfiable->IsUnsatisfiable());
-  }
+  EXPECT(unsatisfiable->Equals(&fullInt64Range));
 
   Range* unsatisfiable_right = new Range(RangeBoundary::PositiveInfinity(),
                                          RangeBoundary::FromConstant(0));
-  if (FLAG_limit_ints_to_64_bits) {
-    EXPECT(unsatisfiable_right->Equals(&fullInt64Range));
-  } else {
-    EXPECT(unsatisfiable_right->IsUnsatisfiable());
-  }
+  EXPECT(unsatisfiable_right->Equals(&fullInt64Range));
 
   Range* unsatisfiable_left = new Range(RangeBoundary::FromConstant(0),
                                         RangeBoundary::NegativeInfinity());
-  if (FLAG_limit_ints_to_64_bits) {
-    EXPECT(unsatisfiable_left->Equals(&fullInt64Range));
-  } else {
-    EXPECT(unsatisfiable_left->IsUnsatisfiable());
-  }
+  EXPECT(unsatisfiable_left->Equals(&fullInt64Range));
 }
 
 TEST_CASE(RangeUtils) {
-  // Use kMin/kMax instead of +/-inf with limited 64-bit integers, as
-  // any range with a +/-inf bound is converted to the full int64
-  // range due to wrap-around.
+  // Use kMin/kMax instead of +/-inf as any range with a +/-inf bound is
+  // converted to the full int64 range due to wrap-around.
   const RangeBoundary negativeInfinity =
-      (FLAG_limit_ints_to_64_bits
-           ? RangeBoundary::FromConstant(RangeBoundary::kMin)
-           : RangeBoundary::NegativeInfinity());
+      RangeBoundary::FromConstant(RangeBoundary::kMin);
   const RangeBoundary positiveInfinity =
-      (FLAG_limit_ints_to_64_bits
-           ? RangeBoundary::FromConstant(RangeBoundary::kMax)
-           : RangeBoundary::PositiveInfinity());
+      RangeBoundary::FromConstant(RangeBoundary::kMax);
 
   // [-inf, +inf].
   const Range& range_0 = *(new Range(negativeInfinity, positiveInfinity));
@@ -285,53 +248,30 @@
 }
 
 TEST_CASE(RangeBinaryOp) {
-  if (FLAG_limit_ints_to_64_bits) {
-    Range* range_a =
-        new Range(RangeBoundary::FromConstant(-1),
-                  RangeBoundary::FromConstant(RangeBoundary::kMax));
-    range_a->Clamp(RangeBoundary::kRangeBoundaryInt32);
-    EXPECT(range_a->min().ConstantValue() == -1);
-    EXPECT(range_a->max().ConstantValue() == kMaxInt32);
-    range_a->set_max(RangeBoundary::FromConstant(RangeBoundary::kMax));
+  Range* range_a = new Range(RangeBoundary::FromConstant(-1),
+                             RangeBoundary::FromConstant(RangeBoundary::kMax));
+  range_a->Clamp(RangeBoundary::kRangeBoundaryInt32);
+  EXPECT(range_a->min().ConstantValue() == -1);
+  EXPECT(range_a->max().ConstantValue() == kMaxInt32);
+  range_a->set_max(RangeBoundary::FromConstant(RangeBoundary::kMax));
 
-    Range* range_b = new Range(RangeBoundary::FromConstant(RangeBoundary::kMin),
-                               RangeBoundary::FromConstant(1));
-    range_b->Clamp(RangeBoundary::kRangeBoundaryInt32);
-    EXPECT(range_b->min().ConstantValue() == kMinInt32);
-    EXPECT(range_b->max().ConstantValue() == 1);
-    range_b->set_min(RangeBoundary::FromConstant(RangeBoundary::kMin));
+  Range* range_b = new Range(RangeBoundary::FromConstant(RangeBoundary::kMin),
+                             RangeBoundary::FromConstant(1));
+  range_b->Clamp(RangeBoundary::kRangeBoundaryInt32);
+  EXPECT(range_b->min().ConstantValue() == kMinInt32);
+  EXPECT(range_b->max().ConstantValue() == 1);
+  range_b->set_min(RangeBoundary::FromConstant(RangeBoundary::kMin));
 
-    {
-      Range result;
-      Range::BinaryOp(Token::kADD, range_a, range_b, NULL, &result);
-      ASSERT(!Range::IsUnknown(&result));
-      EXPECT(!result.min().IsNegativeInfinity());
-      EXPECT(!result.max().IsPositiveInfinity());
-      EXPECT(result.min().Equals(
-          RangeBoundary::MinConstant(RangeBoundary::kRangeBoundaryInt64)));
-      EXPECT(result.max().Equals(
-          RangeBoundary::MaxConstant(RangeBoundary::kRangeBoundaryInt64)));
-    }
-  } else {
-    Range* range_a = new Range(RangeBoundary::FromConstant(-1),
-                               RangeBoundary::PositiveInfinity());
-    range_a->Clamp(RangeBoundary::kRangeBoundaryInt64);
-    EXPECT(range_a->min().ConstantValue() == -1);
-    EXPECT(range_a->max().ConstantValue() == RangeBoundary::kMax);
-
-    Range* range_b = new Range(RangeBoundary::NegativeInfinity(),
-                               RangeBoundary::FromConstant(1));
-    range_b->Clamp(RangeBoundary::kRangeBoundaryInt64);
-    EXPECT(range_b->min().ConstantValue() == RangeBoundary::kMin);
-    EXPECT(range_b->max().ConstantValue() == 1);
-
-    {
-      Range result;
-      Range::BinaryOp(Token::kADD, range_a, range_b, NULL, &result);
-      ASSERT(!Range::IsUnknown(&result));
-      EXPECT(result.min().IsNegativeInfinity());
-      EXPECT(result.max().IsPositiveInfinity());
-    }
+  {
+    Range result;
+    Range::BinaryOp(Token::kADD, range_a, range_b, NULL, &result);
+    ASSERT(!Range::IsUnknown(&result));
+    EXPECT(!result.min().IsNegativeInfinity());
+    EXPECT(!result.max().IsPositiveInfinity());
+    EXPECT(result.min().Equals(
+        RangeBoundary::MinConstant(RangeBoundary::kRangeBoundaryInt64)));
+    EXPECT(result.max().Equals(
+        RangeBoundary::MaxConstant(RangeBoundary::kRangeBoundaryInt64)));
   }
 
   // Test that [5, 10] + [0, 5] = [5, 15].
diff --git a/runtime/vm/compiler/backend/redundancy_elimination.cc b/runtime/vm/compiler/backend/redundancy_elimination.cc
index faadfa6..651a3e6 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination.cc
@@ -3156,10 +3156,8 @@
     // generator functions they may be context-allocated in which case they are
     // not tracked in the environment anyway.
 
-    const intptr_t parameter_count = flow_graph->num_direct_parameters();
-    cdefs[catch_entry->raw_exception_var()->BitIndexIn(parameter_count)] = NULL;
-    cdefs[catch_entry->raw_stacktrace_var()->BitIndexIn(parameter_count)] =
-        NULL;
+    cdefs[flow_graph->EnvIndex(catch_entry->raw_exception_var())] = NULL;
+    cdefs[flow_graph->EnvIndex(catch_entry->raw_stacktrace_var())] = NULL;
 
     for (BlockIterator block_it = flow_graph->reverse_postorder_iterator();
          !block_it.Done(); block_it.Advance()) {
diff --git a/runtime/vm/compiler/call_specializer.cc b/runtime/vm/compiler/call_specializer.cc
index 637823d..f6d8cac 100644
--- a/runtime/vm/compiler/call_specializer.cc
+++ b/runtime/vm/compiler/call_specializer.cc
@@ -1626,14 +1626,12 @@
   } else if (type.IsIntType()) {
     ASSERT((*results)[0] == kSmiCid);
     TryAddTest(results, kMintCid, true);
-    TryAddTest(results, kBigintCid, true);
     // Cannot deoptimize since all tests returning true have been added.
     PurgeNegativeTestCidsEntries(results);
     return false;
   } else if (type.IsNumberType()) {
     ASSERT((*results)[0] == kSmiCid);
     TryAddTest(results, kMintCid, true);
-    TryAddTest(results, kBigintCid, true);
     TryAddTest(results, kDoubleCid, true);
     PurgeNegativeTestCidsEntries(results);
     return false;
diff --git a/runtime/vm/compiler/frontend/flow_graph_builder.cc b/runtime/vm/compiler/frontend/flow_graph_builder.cc
index e7ecaac..d950842 100644
--- a/runtime/vm/compiler/frontend/flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/flow_graph_builder.cc
@@ -837,7 +837,7 @@
     }
     Value* tmp_val = Bind(new (Z) LoadLocalInstr(*tmp_var, token_pos));
     StoreInstanceFieldInstr* store = new (Z)
-        StoreInstanceFieldInstr(Context::variable_offset(local.index()),
+        StoreInstanceFieldInstr(Context::variable_offset(local.index().value()),
                                 context, tmp_val, kEmitStoreBarrier, token_pos);
     Do(store);
     return ExitTempLocalScope(value);
@@ -859,9 +859,9 @@
                                             Type::ZoneHandle(Z, Type::null()),
                                             token_pos));
     }
-    LoadFieldInstr* load =
-        new (Z) LoadFieldInstr(context, Context::variable_offset(local.index()),
-                               local.type(), token_pos);
+    LoadFieldInstr* load = new (Z)
+        LoadFieldInstr(context, Context::variable_offset(local.index().value()),
+                       local.type(), token_pos);
     load->set_is_immutable(local.is_final());
     return load;
   } else {
@@ -2104,8 +2104,8 @@
 }
 
 intptr_t EffectGraphVisitor::GetCurrentTempLocalIndex() const {
-  return kFirstLocalSlotFromFp - owner()->num_stack_locals() -
-         owner()->args_pushed() - owner()->temp_count() + 1;
+  return -owner()->num_stack_locals() - owner()->args_pushed() -
+         owner()->temp_count() + 1;
 }
 
 LocalVariable* EffectGraphVisitor::EnterTempLocalScope(Value* value) {
@@ -2117,7 +2117,7 @@
       new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
                             String::ZoneHandle(Z, Symbols::New(T, name)),
                             *value->Type()->ToAbstractType());
-  var->set_index(index);
+  var->set_index(VariableIndex(index));
   return var;
 }
 
@@ -2132,8 +2132,8 @@
     node->InitializerAt(i)->Visit(&for_value);
     Append(for_value);
     ASSERT(!node->TempAt(i)->HasIndex() ||
-           (node->TempAt(i)->index() == GetCurrentTempLocalIndex()));
-    node->TempAt(i)->set_index(GetCurrentTempLocalIndex());
+           (node->TempAt(i)->index().value() == GetCurrentTempLocalIndex()));
+    node->TempAt(i)->set_index(VariableIndex(GetCurrentTempLocalIndex()));
   }
 }
 
@@ -3341,16 +3341,6 @@
             token_pos, element_type, length, owner()->GetNextDeoptId());
         return ReturnDefinition(create_array);
       }
-      case MethodRecognizer::kBigint_getDigits: {
-        return ReturnDefinition(BuildNativeGetter(
-            node, kind, Bigint::digits_offset(), Object::dynamic_type(),
-            kTypedDataUint32ArrayCid));
-      }
-      case MethodRecognizer::kBigint_getUsed: {
-        return ReturnDefinition(
-            BuildNativeGetter(node, kind, Bigint::used_offset(),
-                              Type::ZoneHandle(Z, Type::SmiType()), kSmiCid));
-      }
       case MethodRecognizer::kLinkedHashMap_getIndex: {
         return ReturnDefinition(BuildNativeGetter(
             node, kind, LinkedHashMap::index_offset(), Object::dynamic_type(),
@@ -3399,11 +3389,6 @@
         return ReturnDefinition(DoNativeSetterStoreValue(
             node, LinkedHashMap::deleted_keys_offset(), kNoStoreBarrier));
       }
-      case MethodRecognizer::kBigint_getNeg: {
-        return ReturnDefinition(
-            BuildNativeGetter(node, kind, Bigint::neg_offset(),
-                              Type::ZoneHandle(Z, Type::BoolType()), kBoolCid));
-      }
       default:
         break;
     }
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 501c73f..23c595e 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -1007,6 +1007,7 @@
   Field& field = Field::Handle(builder_->zone_);
   Class& cls = Class::Handle(builder_->zone_);
   String& name = String::Handle(builder_->zone_);
+  TypeArguments& type_args = TypeArguments::Handle(builder_->zone_);
   const intptr_t obj_count = pool.Length();
   for (intptr_t i = from_index; i < obj_count; ++i) {
     const intptr_t tag = builder_->ReadTag();
@@ -1056,8 +1057,15 @@
         }
       } break;
       case ConstantPoolTag::kICData: {
-        StringIndex target = builder_->ReadStringReference();
-        name = H.DartSymbolPlain(target).raw();
+        InvocationKind kind = static_cast<InvocationKind>(builder_->ReadByte());
+        if (kind == InvocationKind::getter) {
+          name = builder_->ReadNameAsGetterName().raw();
+        } else if (kind == InvocationKind::setter) {
+          name = builder_->ReadNameAsSetterName().raw();
+        } else {
+          ASSERT(kind == InvocationKind::method);
+          name = builder_->ReadNameAsMethodName().raw();
+        }
         intptr_t arg_desc_index = builder_->ReadUInt();
         ASSERT(arg_desc_index < i);
         array ^= pool.ObjectAt(arg_desc_index);
@@ -1167,12 +1175,11 @@
         cls =
             H.LookupClassByKernelClass(builder_->ReadCanonicalNameReference());
         obj = Instance::New(cls, Heap::kOld);
-        intptr_t elem_index = builder_->ReadUInt();
-        ASSERT(elem_index < i);
-        elem = pool.ObjectAt(elem_index);
-        if (!elem.IsNull()) {
-          ASSERT(elem.IsTypeArguments());
-          Instance::Cast(obj).SetTypeArguments(TypeArguments::Cast(elem));
+        intptr_t type_args_index = builder_->ReadUInt();
+        ASSERT(type_args_index < i);
+        type_args ^= pool.ObjectAt(type_args_index);
+        if (!type_args.IsNull()) {
+          Instance::Cast(obj).SetTypeArguments(type_args);
         }
         intptr_t num_fields = builder_->ReadUInt();
         for (intptr_t j = 0; j < num_fields; j++) {
@@ -1193,12 +1200,10 @@
       case kTypeArgumentsForInstanceAllocation: {
         cls =
             H.LookupClassByKernelClass(builder_->ReadCanonicalNameReference());
-        intptr_t elem_index = builder_->ReadUInt();
-        ASSERT(elem_index < i);
-        elem = pool.ObjectAt(elem_index);
-        ASSERT(elem.IsNull() || elem.IsTypeArguments());
-        elem =
-            Type::New(cls, TypeArguments::Cast(elem), TokenPosition::kNoSource);
+        intptr_t type_args_index = builder_->ReadUInt();
+        ASSERT(type_args_index < i);
+        type_args ^= pool.ObjectAt(type_args_index);
+        elem = Type::New(cls, type_args, TokenPosition::kNoSource);
         elem = ClassFinalizer::FinalizeType(cls, Type::Cast(elem));
         obj = Type::Cast(elem).arguments();
       } break;
@@ -1264,6 +1269,8 @@
         closure.SetParameterNameAt(pos, Symbols::ClosureParameter());
         pos++;
 
+        const Library& lib = Library::Handle(
+            builder_->zone_, builder_->active_class()->klass->library());
         for (intptr_t j = 0; j < positional_parameter_count; ++j, ++pos) {
           VariableDeclarationHelper helper(builder_);
           helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
@@ -1276,7 +1283,7 @@
 
           closure.SetParameterTypeAt(pos, type);
           closure.SetParameterNameAt(pos,
-                                     H.DartSymbolObfuscate(helper.name_index_));
+                                     H.DartIdentifier(lib, helper.name_index_));
         }
 
         intptr_t named_parameter_count_check = builder_->ReadListLength();
@@ -1293,7 +1300,7 @@
 
           closure.SetParameterTypeAt(pos, type);
           closure.SetParameterNameAt(pos,
-                                     H.DartSymbolObfuscate(helper.name_index_));
+                                     H.DartIdentifier(lib, helper.name_index_));
         }
 
         function_node_helper.SetJustRead(FunctionNodeHelper::kNamedParameters);
@@ -1396,11 +1403,12 @@
           Script::Handle(Z, parsed_function->function().script()),
           zone_,
           TypedData::Handle(Z, parsed_function->function().KernelData()),
-          parsed_function->function().KernelDataProgramOffset())),
+          parsed_function->function().KernelDataProgramOffset(),
+          &active_class_)),
       type_translator_(builder_, /*finalize=*/true) {
   H.InitFromScript(builder_->script());
-  type_translator_.active_class_ = &active_class_;
-  builder_->type_translator_.active_class_ = &active_class_;
+  ASSERT(type_translator_.active_class_ == &active_class_);
+  ASSERT(builder_->type_translator_.active_class_ == &active_class_);
 }
 
 StreamingScopeBuilder::~StreamingScopeBuilder() {
@@ -1436,7 +1444,7 @@
     result_->this_variable =
         MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
                      Symbols::This(), klass_type);
-    result_->this_variable->set_index(0);
+    result_->this_variable->set_index(VariableIndex(0));
     result_->this_variable->set_is_captured();
     enclosing_scope = new (Z) LocalScope(NULL, 0, 0);
     enclosing_scope->set_context_level(0);
@@ -3967,10 +3975,10 @@
 }
 
 void StreamingConstantEvaluator::EvaluateSymbolLiteral() {
-  // The symbol value is read plain and obfuscated later.
-  const String& symbol_value = H.DartSymbolPlain(
-      builder_->ReadStringReference());  // read index into string table.
-
+  const Class& owner =
+      Class::Handle(Z, builder_->parsed_function()->function().Owner());
+  const Library& lib = Library::Handle(Z, owner.library());
+  String& symbol_value = H.DartIdentifier(lib, builder_->ReadStringReference());
   const Class& symbol_class =
       Class::ZoneHandle(Z, I->object_store()->symbol_class());
   ASSERT(!symbol_class.IsNull());
@@ -6064,12 +6072,10 @@
     // Copy captured parameters from the stack into the context.
     LocalScope* scope = parsed_function()->node_sequence()->scope();
     intptr_t parameter_count = dart_function.NumParameters();
-    intptr_t parameter_index = parsed_function()->first_parameter_index();
-
     const ParsedFunction& pf = *flow_graph_builder_->parsed_function_;
     const Function& function = pf.function();
 
-    for (intptr_t i = 0; i < parameter_count; ++i, --parameter_index) {
+    for (intptr_t i = 0; i < parameter_count; ++i) {
       LocalVariable* variable = scope->VariableAt(i);
       if (variable->is_captured()) {
         LocalVariable& raw_parameter = *pf.RawParameterVariable(i);
@@ -6086,7 +6092,7 @@
         body += LoadLocal(&raw_parameter);
         body += flow_graph_builder_->StoreInstanceField(
             TokenPosition::kNoSource,
-            Context::variable_offset(variable->index()));
+            Context::variable_offset(variable->index().value()));
         body += NullConstant();
         body += StoreLocal(TokenPosition::kNoSource, &raw_parameter);
         body += Drop();
@@ -7419,8 +7425,7 @@
 }
 
 ActiveClass* StreamingFlowGraphBuilder::active_class() {
-  return (flow_graph_builder_ != NULL) ? &flow_graph_builder_->active_class_
-                                       : NULL;
+  return active_class_;
 }
 
 ScopeBuildingResult* StreamingFlowGraphBuilder::scopes() {
@@ -10866,6 +10871,7 @@
 
   // Step a) Create array of [TypeParameter] objects (without bound).
   type_parameters = TypeArguments::New(type_parameter_count);
+  const Library& lib = Library::Handle(Z, active_class->klass->library());
   {
     AlternativeReadingScope alt(&reader_);
     for (intptr_t i = 0; i < type_parameter_count; i++) {
@@ -10874,7 +10880,7 @@
       parameter = TypeParameter::New(
           set_on_class ? *active_class->klass : Class::Handle(Z),
           parameterized_function, i,
-          H.DartSymbolObfuscate(helper.name_index_),  // read ith name index.
+          H.DartIdentifier(lib, helper.name_index_),  // read ith name index.
           null_bound, TokenPosition::kNoSource);
       type_parameters.SetTypeAt(i, parameter);
     }
@@ -10979,6 +10985,7 @@
     pos++;
   }
 
+  const Library& lib = Library::Handle(Z, active_class->klass->library());
   for (intptr_t i = 0; i < positional_parameter_count; ++i, ++pos) {
     // Read ith variable declaration.
     VariableDeclarationHelper helper(this);
@@ -10991,7 +10998,7 @@
 
     function.SetParameterTypeAt(
         pos, type.IsMalformed() ? Type::dynamic_type() : type);
-    function.SetParameterNameAt(pos, H.DartSymbolObfuscate(helper.name_index_));
+    function.SetParameterNameAt(pos, H.DartIdentifier(lib, helper.name_index_));
   }
 
   intptr_t named_parameter_count_check = ReadListLength();  // read list length.
@@ -11008,7 +11015,7 @@
 
     function.SetParameterTypeAt(
         pos, type.IsMalformed() ? Type::dynamic_type() : type);
-    function.SetParameterNameAt(pos, H.DartSymbolObfuscate(helper.name_index_));
+    function.SetParameterNameAt(pos, H.DartIdentifier(lib, helper.name_index_));
   }
 
   function_node_helper->SetJustRead(FunctionNodeHelper::kNamedParameters);
@@ -11071,16 +11078,11 @@
   return param_descriptor.raw();
 }
 
-RawObject* StreamingFlowGraphBuilder::EvaluateMetadata(
-    intptr_t kernel_offset,
-    const Class& owner_class) {
+RawObject* StreamingFlowGraphBuilder::EvaluateMetadata(intptr_t kernel_offset) {
   SetOffset(kernel_offset);
   const Tag tag = PeekTag();
 
-  // Setup active_class in type translator for type finalization.
-  ActiveClass active_class;
-  active_class.klass = &owner_class;
-  type_translator_.set_active_class(&active_class);
+  ASSERT(active_class() != NULL);
 
   if (tag == kClass) {
     ClassHelper class_helper(this);
@@ -11109,8 +11111,6 @@
     metadata_values.SetAt(i, value);
   }
 
-  type_translator_.set_active_class(NULL);
-
   return metadata_values.raw();
 }
 
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 859d443..662514f 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -713,10 +713,6 @@
 
   const Type& ReceiverType(const Class& klass);
 
-  void set_active_class(ActiveClass* active_class) {
-    active_class_ = active_class;
-  }
-
  private:
   // Can build a malformed type.
   void BuildTypeInternal(bool invalid_as_dynamic = false);
@@ -753,7 +749,7 @@
 
   StreamingFlowGraphBuilder* builder_;
   TranslationHelper& translation_helper_;
-  ActiveClass* active_class_;
+  ActiveClass* const active_class_;
   TypeParameterScope* type_parameter_scope_;
   Zone* zone_;
   AbstractType& result_;
@@ -1205,6 +1201,7 @@
             data,
             data_program_offset),
         flow_graph_builder_(flow_graph_builder),
+        active_class_(&flow_graph_builder->active_class_),
         constant_evaluator_(this),
         type_translator_(this, /* finalize= */ true),
         current_script_id_(-1),
@@ -1221,13 +1218,15 @@
                             Zone* zone,
                             const uint8_t* data_buffer,
                             intptr_t buffer_length,
-                            intptr_t data_program_offset)
+                            intptr_t data_program_offset,
+                            ActiveClass* active_class)
       : KernelReaderHelper(zone,
                            translation_helper,
                            data_buffer,
                            buffer_length,
                            data_program_offset),
         flow_graph_builder_(NULL),
+        active_class_(active_class),
         constant_evaluator_(this),
         type_translator_(this, /* finalize= */ true),
         current_script_id_(-1),
@@ -1244,13 +1243,15 @@
                             const Script& script,
                             Zone* zone,
                             const TypedData& data,
-                            intptr_t data_program_offset)
+                            intptr_t data_program_offset,
+                            ActiveClass* active_class)
       : KernelReaderHelper(zone,
                            translation_helper,
                            script,
                            data,
                            data_program_offset),
         flow_graph_builder_(NULL),
+        active_class_(active_class),
         constant_evaluator_(this),
         type_translator_(this, /* finalize= */ true),
         current_script_id_(-1),
@@ -1271,7 +1272,7 @@
 
   Fragment BuildStatementAt(intptr_t kernel_offset);
   RawObject* BuildParameterDescriptor(intptr_t kernel_offset);
-  RawObject* EvaluateMetadata(intptr_t kernel_offset, const Class& owner_class);
+  RawObject* EvaluateMetadata(intptr_t kernel_offset);
   void CollectTokenPositionsFor(
       intptr_t script_index,
       intptr_t initial_script_index,
@@ -1586,6 +1587,7 @@
   void EnsureMetadataIsScanned();
 
   FlowGraphBuilder* flow_graph_builder_;
+  ActiveClass* const active_class_;
   StreamingConstantEvaluator constant_evaluator_;
   StreamingDartTypeTranslator type_translator_;
   intptr_t current_script_id_;
@@ -1735,7 +1737,7 @@
   bool ShouldSkipConstant(NameIndex index);
 
   NameIndex skip_vmservice_library_;
-  ActiveClass* active_class_;
+  ActiveClass* const active_class_;
   StreamingFlowGraphBuilder& builder_;
   StreamingDartTypeTranslator& type_translator_;
   StreamingConstantEvaluator const_evaluator_;
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 73619a7..4d9b1c6 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -487,6 +487,13 @@
   return result;
 }
 
+String& TranslationHelper::DartIdentifier(const Library& lib,
+                                          StringIndex string_index) {
+  String& name = DartString(string_index);
+  ManglePrivateName(lib, &name);
+  return name;
+}
+
 const String& TranslationHelper::DartClassName(NameIndex kernel_class) {
   ASSERT(IsClass(kernel_class));
   String& name = DartString(CanonicalNameString(kernel_class));
@@ -1214,16 +1221,16 @@
   if (exception_var->is_captured()) {
     instructions += LoadLocal(context_variable);
     instructions += LoadLocal(raw_exception_var);
-    instructions +=
-        StoreInstanceField(TokenPosition::kNoSource,
-                           Context::variable_offset(exception_var->index()));
+    instructions += StoreInstanceField(
+        TokenPosition::kNoSource,
+        Context::variable_offset(exception_var->index().value()));
   }
   if (stacktrace_var->is_captured()) {
     instructions += LoadLocal(context_variable);
     instructions += LoadLocal(raw_stacktrace_var);
-    instructions +=
-        StoreInstanceField(TokenPosition::kNoSource,
-                           Context::variable_offset(stacktrace_var->index()));
+    instructions += StoreInstanceField(
+        TokenPosition::kNoSource,
+        Context::variable_offset(stacktrace_var->index().value()));
   }
 
   // :saved_try_context_var can be captured in the context of
@@ -1532,7 +1539,8 @@
   if (variable->is_captured()) {
     Fragment instructions;
     instructions += LoadContextAt(variable->owner()->context_level());
-    instructions += LoadField(Context::variable_offset(variable->index()));
+    instructions +=
+        LoadField(Context::variable_offset(variable->index().value()));
     return instructions;
   } else {
     return BaseFlowGraphBuilder::LoadLocal(variable);
@@ -1800,7 +1808,7 @@
     instructions += LoadContextAt(variable->owner()->context_level());
     instructions += LoadLocal(value);
     instructions += StoreInstanceField(
-        position, Context::variable_offset(variable->index()));
+        position, Context::variable_offset(variable->index().value()));
     return instructions;
   }
   return StoreLocalRaw(position, variable);
@@ -1962,9 +1970,8 @@
                             symbol_name, Object::dynamic_type());
   // Set the index relative to the base of the expression stack including
   // outgoing arguments.
-  variable->set_index(kFirstLocalSlotFromFp -
-                      parsed_function_->num_stack_locals() -
-                      pending_argument_count_ - index);
+  variable->set_index(VariableIndex(-parsed_function_->num_stack_locals() -
+                                    pending_argument_count_ - index));
 
   // The value has uses as if it were a local variable.  Mark the definition
   // as used so that its temp index will not be cleared (causing it to never
@@ -2205,16 +2212,6 @@
       body += LoadLocal(LookupVariable(first_positional_offset));
       body += CreateArray();
       break;
-    case MethodRecognizer::kBigint_getDigits:
-      body += LoadLocal(scopes_->this_variable);
-      body += LoadNativeField(kind, Bigint::digits_offset(),
-                              Object::dynamic_type(), kTypedDataUint32ArrayCid);
-      break;
-    case MethodRecognizer::kBigint_getUsed:
-      body += LoadLocal(scopes_->this_variable);
-      body += LoadNativeField(kind, Bigint::used_offset(),
-                              Type::ZoneHandle(Z, Type::SmiType()), kSmiCid);
-      break;
     case MethodRecognizer::kLinkedHashMap_getIndex:
       body += LoadLocal(scopes_->this_variable);
       body += LoadNativeField(kind, LinkedHashMap::index_offset(),
@@ -2278,11 +2275,6 @@
                                  kNoStoreBarrier);
       body += NullConstant();
       break;
-    case MethodRecognizer::kBigint_getNeg:
-      body += LoadLocal(scopes_->this_variable);
-      body += LoadNativeField(kind, Bigint::neg_offset(),
-                              Type::ZoneHandle(Z, Type::BoolType()), kBoolCid);
-      break;
     default: {
       String& name = String::ZoneHandle(Z, function.native_name());
       if (function.IsGeneric() &&
@@ -2837,13 +2829,16 @@
     Script& script = Script::Handle(Z, metadata_field.Script());
     helper.InitFromScript(script);
 
+    const Class& owner_class = Class::Handle(Z, metadata_field.Owner());
+    ActiveClass active_class;
+    ActiveClassScope active_class_scope(&active_class, &owner_class);
+
     StreamingFlowGraphBuilder streaming_flow_graph_builder(
         &helper, Script::Handle(Z, metadata_field.Script()), Z,
         TypedData::Handle(Z, metadata_field.KernelData()),
-        metadata_field.KernelDataProgramOffset());
-    const Class& owner_class = Class::Handle(Z, metadata_field.Owner());
+        metadata_field.KernelDataProgramOffset(), &active_class);
     return streaming_flow_graph_builder.EvaluateMetadata(
-        metadata_field.kernel_offset(), owner_class);
+        metadata_field.kernel_offset());
   } else {
     Thread* thread = Thread::Current();
     Error& error = Error::Handle();
@@ -2865,7 +2860,7 @@
     StreamingFlowGraphBuilder streaming_flow_graph_builder(
         &helper, Script::Handle(Z, function.script()), Z,
         TypedData::Handle(Z, function.KernelData()),
-        function.KernelDataProgramOffset());
+        function.KernelDataProgramOffset(), /* active_class = */ NULL);
     return streaming_flow_graph_builder.BuildParameterDescriptor(
         function.kernel_offset());
   } else {
@@ -2928,7 +2923,8 @@
   }
 
   StreamingFlowGraphBuilder streaming_flow_graph_builder(
-      helper, script, zone_, kernel_data, data_kernel_offset);
+      helper, script, zone_, kernel_data, data_kernel_offset,
+      /* active_class = */ NULL);
   streaming_flow_graph_builder.CollectTokenPositionsFor(
       script.kernel_script_index(), entry_script.kernel_script_index(),
       kernel_offset, token_positions, yield_positions);
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index 97e4aaa..1559f4f 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -395,6 +395,8 @@
   const String& DartSymbolObfuscate(const char* content) const;
   String& DartSymbolObfuscate(StringIndex string_index) const;
 
+  String& DartIdentifier(const Library& lib, StringIndex string_index);
+
   const String& DartClassName(NameIndex kernel_class);
 
   const String& DartConstructorName(NameIndex constructor);
@@ -911,7 +913,6 @@
 
   friend class BreakableBlock;
   friend class CatchBlock;
-  friend class ConstantEvaluator;
   friend class KernelReaderHelper;
   friend class StreamingFlowGraphBuilder;
   friend class ScopeBuilder;
diff --git a/runtime/vm/compiler/intrinsifier.cc b/runtime/vm/compiler/intrinsifier.cc
index d7ffab5..2e28b70 100644
--- a/runtime/vm/compiler/intrinsifier.cc
+++ b/runtime/vm/compiler/intrinsifier.cc
@@ -741,13 +741,9 @@
   if (cid == kExternalOneByteStringCid) {
     str = builder.AddDefinition(new LoadUntaggedInstr(
         new Value(str), ExternalOneByteString::external_data_offset()));
-    str = builder.AddDefinition(new LoadUntaggedInstr(
-        new Value(str), RawExternalOneByteString::ExternalData::data_offset()));
   } else if (cid == kExternalTwoByteStringCid) {
     str = builder.AddDefinition(new LoadUntaggedInstr(
         new Value(str), ExternalTwoByteString::external_data_offset()));
-    str = builder.AddDefinition(new LoadUntaggedInstr(
-        new Value(str), RawExternalTwoByteString::ExternalData::data_offset()));
   }
 
   Definition* result = builder.AddDefinition(new LoadIndexedInstr(
diff --git a/runtime/vm/compiler/intrinsifier_arm.cc b/runtime/vm/compiler/intrinsifier_arm.cc
index 201306d..9256dc6 100644
--- a/runtime/vm/compiler/intrinsifier_arm.cc
+++ b/runtime/vm/compiler/intrinsifier_arm.cc
@@ -634,8 +634,8 @@
   CompareIntegers(assembler, GE);
 }
 
-// This is called for Smi, Mint and Bigint receivers. The right argument
-// can be Smi, Mint, Bigint or double.
+// This is called for Smi and Mint receivers. The right argument
+// can be Smi, Mint or double.
 void Intrinsifier::Integer_equalToInteger(Assembler* assembler) {
   Label fall_through, true_label, check_for_mint;
   // For integer receiver '===' check first.
@@ -663,7 +663,7 @@
   __ b(&receiver_not_smi, NE);
 
   // Left (receiver) is Smi, return false if right is not Double.
-  // Note that an instance of Mint or Bigint never contains a value that can be
+  // Note that an instance of Mint never contains a value that can be
   // represented by Smi.
 
   __ CompareClassId(R0, kDoubleCid, R2);
@@ -1143,7 +1143,7 @@
   __ Ret();
 }
 
-void Intrinsifier::Bigint_estQuotientDigit(Assembler* assembler) {
+void Intrinsifier::Bigint_estimateQuotientDigit(Assembler* assembler) {
   // No unsigned 64-bit / 32-bit divide instruction.
 }
 
@@ -1305,7 +1305,7 @@
   DoubleArithmeticOperations(assembler, Token::kDIV);
 }
 
-// Left is double right is integer (Bigint, Mint or Smi)
+// Left is double, right is integer (Mint or Smi)
 void Intrinsifier::Double_mulFromInteger(Assembler* assembler) {
   if (TargetCPUFeatures::vfp_supported()) {
     Label fall_through;
@@ -1576,14 +1576,14 @@
                           Register cid,
                           Register tmp,
                           Label* target) {
-  RangeCheck(assembler, cid, tmp, kSmiCid, kBigintCid, kIfInRange, target);
+  RangeCheck(assembler, cid, tmp, kSmiCid, kMintCid, kIfInRange, target);
 }
 
 static void JumpIfNotInteger(Assembler* assembler,
                              Register cid,
                              Register tmp,
                              Label* target) {
-  RangeCheck(assembler, cid, tmp, kSmiCid, kBigintCid, kIfNotInRange, target);
+  RangeCheck(assembler, cid, tmp, kSmiCid, kMintCid, kIfNotInRange, target);
 }
 
 static void JumpIfString(Assembler* assembler,
diff --git a/runtime/vm/compiler/intrinsifier_arm64.cc b/runtime/vm/compiler/intrinsifier_arm64.cc
index ef7fb20..ff9ef0e 100644
--- a/runtime/vm/compiler/intrinsifier_arm64.cc
+++ b/runtime/vm/compiler/intrinsifier_arm64.cc
@@ -530,8 +530,8 @@
   CompareIntegers(assembler, GE);
 }
 
-// This is called for Smi, Mint and Bigint receivers. The right argument
-// can be Smi, Mint, Bigint or double.
+// This is called for Smi and Mint receivers. The right argument
+// can be Smi, Mint or double.
 void Intrinsifier::Integer_equalToInteger(Assembler* assembler) {
   Label fall_through, true_label, check_for_mint;
   // For integer receiver '===' check first.
@@ -558,7 +558,7 @@
   __ BranchIfNotSmi(R1, &receiver_not_smi);  // Check receiver.
 
   // Left (receiver) is Smi, return false if right is not Double.
-  // Note that an instance of Mint or Bigint never contains a value that can be
+  // Note that an instance of Mint never contains a value that can be
   // represented by Smi.
 
   __ CompareClassId(R0, kDoubleCid);
@@ -1068,7 +1068,7 @@
   __ ret();
 }
 
-void Intrinsifier::Bigint_estQuotientDigit(Assembler* assembler) {
+void Intrinsifier::Bigint_estimateQuotientDigit(Assembler* assembler) {
   // There is no 128-bit by 64-bit division instruction on arm64, so we use two
   // 64-bit by 32-bit divisions and two 64-bit by 64-bit multiplications to
   // adjust the two 32-bit digits of the estimated quotient.
@@ -1402,7 +1402,7 @@
   DoubleArithmeticOperations(assembler, Token::kDIV);
 }
 
-// Left is double right is integer (Bigint, Mint or Smi)
+// Left is double, right is integer (Mint or Smi)
 void Intrinsifier::Double_mulFromInteger(Assembler* assembler) {
   Label fall_through;
   // Only smis allowed.
@@ -1637,14 +1637,14 @@
                           Register cid,
                           Register tmp,
                           Label* target) {
-  RangeCheck(assembler, cid, tmp, kSmiCid, kBigintCid, kIfInRange, target);
+  RangeCheck(assembler, cid, tmp, kSmiCid, kMintCid, kIfInRange, target);
 }
 
 static void JumpIfNotInteger(Assembler* assembler,
                              Register cid,
                              Register tmp,
                              Label* target) {
-  RangeCheck(assembler, cid, tmp, kSmiCid, kBigintCid, kIfNotInRange, target);
+  RangeCheck(assembler, cid, tmp, kSmiCid, kMintCid, kIfNotInRange, target);
 }
 
 static void JumpIfString(Assembler* assembler,
diff --git a/runtime/vm/compiler/intrinsifier_ia32.cc b/runtime/vm/compiler/intrinsifier_ia32.cc
index 2e46b55..931cdbf 100644
--- a/runtime/vm/compiler/intrinsifier_ia32.cc
+++ b/runtime/vm/compiler/intrinsifier_ia32.cc
@@ -628,8 +628,8 @@
   CompareIntegers(assembler, GREATER_EQUAL);
 }
 
-// This is called for Smi, Mint and Bigint receivers. The right argument
-// can be Smi, Mint, Bigint or double.
+// This is called for Smi and Mint receivers. The right argument
+// can be Smi, Mint or double.
 void Intrinsifier::Integer_equalToInteger(Assembler* assembler) {
   Label fall_through, true_label, check_for_mint;
   // For integer receiver '===' check first.
@@ -655,7 +655,7 @@
   __ j(NOT_ZERO, &receiver_not_smi);
 
   // Left (receiver) is Smi, return false if right is not Double.
-  // Note that an instance of Mint or Bigint never contains a value that can be
+  // Note that an instance of Mint never contains a value that can be
   // represented by Smi.
   __ movl(EAX, Address(ESP, +1 * kWordSize));  // Right argument.
   __ CompareClassId(EAX, kDoubleCid, EDI);
@@ -1188,7 +1188,7 @@
   __ ret();
 }
 
-void Intrinsifier::Bigint_estQuotientDigit(Assembler* assembler) {
+void Intrinsifier::Bigint_estimateQuotientDigit(Assembler* assembler) {
   // Pseudo code:
   // static int _estQuotientDigit(Uint32List args, Uint32List digits, int i) {
   //   uint32_t yt = args[_YT];  // _YT == 1.
@@ -1402,7 +1402,7 @@
   DoubleArithmeticOperations(assembler, Token::kDIV);
 }
 
-// Left is double right is integer (Bigint, Mint or Smi)
+// Left is double, right is integer (Mint or Smi)
 void Intrinsifier::Double_mulFromInteger(Assembler* assembler) {
   Label fall_through;
   // Only smis allowed.
@@ -1642,13 +1642,13 @@
 const Condition kIfInRange = BELOW_EQUAL;
 
 static void JumpIfInteger(Assembler* assembler, Register cid, Label* target) {
-  RangeCheck(assembler, cid, kSmiCid, kBigintCid, kIfInRange, target);
+  RangeCheck(assembler, cid, kSmiCid, kMintCid, kIfInRange, target);
 }
 
 static void JumpIfNotInteger(Assembler* assembler,
                              Register cid,
                              Label* target) {
-  RangeCheck(assembler, cid, kSmiCid, kBigintCid, kIfNotInRange, target);
+  RangeCheck(assembler, cid, kSmiCid, kMintCid, kIfNotInRange, target);
 }
 
 static void JumpIfString(Assembler* assembler, Register cid, Label* target) {
diff --git a/runtime/vm/compiler/intrinsifier_x64.cc b/runtime/vm/compiler/intrinsifier_x64.cc
index a3a0c9b..0d41621 100644
--- a/runtime/vm/compiler/intrinsifier_x64.cc
+++ b/runtime/vm/compiler/intrinsifier_x64.cc
@@ -591,8 +591,8 @@
   CompareIntegers(assembler, GREATER_EQUAL);
 }
 
-// This is called for Smi, Mint and Bigint receivers. The right argument
-// can be Smi, Mint, Bigint or double.
+// This is called for Smi and Mint receivers. The right argument
+// can be Smi, Mint or double.
 void Intrinsifier::Integer_equalToInteger(Assembler* assembler) {
   Label fall_through, true_label, check_for_mint;
   const intptr_t kReceiverOffset = 2;
@@ -621,7 +621,7 @@
   __ j(NOT_ZERO, &receiver_not_smi);
 
   // Left (receiver) is Smi, return false if right is not Double.
-  // Note that an instance of Mint or Bigint never contains a value that can be
+  // Note that an instance of Mint never contains a value that can be
   // represented by Smi.
   __ movq(RAX, Address(RSP, +kArgumentOffset * kWordSize));
   __ CompareClassId(RAX, kDoubleCid);
@@ -1104,7 +1104,7 @@
   __ ret();
 }
 
-void Intrinsifier::Bigint_estQuotientDigit(Assembler* assembler) {
+void Intrinsifier::Bigint_estimateQuotientDigit(Assembler* assembler) {
   // Pseudo code:
   // static int _estQuotientDigit(Uint32List args, Uint32List digits, int i) {
   //   uint64_t yt = args[_YT_LO .. _YT];  // _YT_LO == 0, _YT == 1.
@@ -1335,7 +1335,7 @@
   __ Bind(&fall_through);
 }
 
-// Left is double right is integer (Bigint, Mint or Smi)
+// Left is double, right is integer (Mint or Smi)
 void Intrinsifier::DoubleFromInteger(Assembler* assembler) {
   Label fall_through;
   __ movq(RAX, Address(RSP, +1 * kWordSize));
@@ -1551,13 +1551,13 @@
 const Condition kIfInRange = BELOW_EQUAL;
 
 static void JumpIfInteger(Assembler* assembler, Register cid, Label* target) {
-  RangeCheck(assembler, cid, kSmiCid, kBigintCid, kIfInRange, target);
+  RangeCheck(assembler, cid, kSmiCid, kMintCid, kIfInRange, target);
 }
 
 static void JumpIfNotInteger(Assembler* assembler,
                              Register cid,
                              Label* target) {
-  RangeCheck(assembler, cid, kSmiCid, kBigintCid, kIfNotInRange, target);
+  RangeCheck(assembler, cid, kSmiCid, kMintCid, kIfNotInRange, target);
 }
 
 static void JumpIfString(Assembler* assembler, Register cid, Label* target) {
diff --git a/runtime/vm/compiler/method_recognizer.h b/runtime/vm/compiler/method_recognizer.h
index 6f97c60..952a9d7 100644
--- a/runtime/vm/compiler/method_recognizer.h
+++ b/runtime/vm/compiler/method_recognizer.h
@@ -118,10 +118,7 @@
   V(_Int32x4, withFlagZ, Int32x4WithFlagZ, Int32x4, 0x267acdfa)                \
   V(_Int32x4, withFlagW, Int32x4WithFlagW, Int32x4, 0x345ac675)                \
   V(_Int64List, [], Int64ArrayGetIndexed, Dynamic, 0x51eafb97)                 \
-  V(_Int64List, []=, Int64ArraySetIndexed, Dynamic, 0x4ddf27d5)                \
-  V(_Bigint, get:_neg, Bigint_getNeg, Bool, 0x35608e23)                        \
-  V(_Bigint, get:_used, Bigint_getUsed, Smi, 0x33bac590)                       \
-  V(_Bigint, get:_digits, Bigint_getDigits, TypedDataUint32Array, 0x68df70f8)  \
+  V(_Int64List, []=, Int64ArraySetIndexed, Dynamic, 0x376181fb)                \
   V(_HashVMBase, get:_index, LinkedHashMap_getIndex, TypedDataUint32Array,     \
       0x02477157)                                                              \
   V(_HashVMBase, set:_index, LinkedHashMap_setIndex, Dynamic, 0x4fc8d5e0)      \
@@ -153,7 +150,7 @@
   V(_BigIntImpl, _absSub, Bigint_absSub, Dynamic, 0x1de5bd32)                  \
   V(_BigIntImpl, _mulAdd, Bigint_mulAdd, Smi, 0x6f277966)                      \
   V(_BigIntImpl, _sqrAdd, Bigint_sqrAdd, Smi, 0x68e4c8ea)                      \
-  V(_BigIntImpl, _estimateQuotientDigit, Bigint_estQuotientDigit, Smi,         \
+  V(_BigIntImpl, _estimateQuotientDigit, Bigint_estimateQuotientDigit, Smi,    \
     0x35456d91)                                                                \
   V(_BigIntMontgomeryReduction, _mulMod, Montgomery_mulMod, Smi, 0x0f7b0375)   \
   V(_Double, >, Double_greaterThan, Bool, 0x4f1375a3)                          \
@@ -204,26 +201,26 @@
 #define CORE_INTEGER_LIB_INTRINSIC_LIST(V)                                     \
   V(_IntegerImplementation, _addFromInteger, Integer_addFromInteger,           \
     Dynamic, 0x6a10c54a)                                                       \
-  V(_IntegerImplementation, +, Integer_add, Dynamic, 0x4f5804de)               \
+  V(_IntegerImplementation, +, Integer_add, Dynamic, 0x43d53af7)               \
   V(_IntegerImplementation, _subFromInteger, Integer_subFromInteger, Dynamic,  \
     0x3fa4b1ed)                                                                \
-  V(_IntegerImplementation, -, Integer_sub, Dynamic, 0x183b13bf)               \
+  V(_IntegerImplementation, -, Integer_sub, Dynamic, 0x2dc22e03)               \
   V(_IntegerImplementation, _mulFromInteger, Integer_mulFromInteger,           \
     Dynamic, 0x3216e299)                                                       \
-  V(_IntegerImplementation, *, Integer_mul, Dynamic, 0x4014c3c0)               \
+  V(_IntegerImplementation, *, Integer_mul, Dynamic, 0x4e7a1c24)               \
   V(_IntegerImplementation, _moduloFromInteger, Integer_moduloFromInteger,     \
     Dynamic, 0x6348b974)                                                       \
-  V(_IntegerImplementation, ~/, Integer_truncDivide, Dynamic, 0x082b321e)      \
+  V(_IntegerImplementation, ~/, Integer_truncDivide, Dynamic, 0x4efb2d39)      \
   V(_IntegerImplementation, unary-, Integer_negate, Dynamic, 0x428bf6fa)       \
   V(_IntegerImplementation, _bitAndFromInteger, Integer_bitAndFromInteger,     \
     Dynamic, 0x395b1678)                                                       \
-  V(_IntegerImplementation, &, Integer_bitAnd, Dynamic, 0x32c46c28)            \
+  V(_IntegerImplementation, &, Integer_bitAnd, Dynamic, 0x5ab35f30)            \
   V(_IntegerImplementation, _bitOrFromInteger, Integer_bitOrFromInteger,       \
     Dynamic, 0x6a36b395)                                                       \
-  V(_IntegerImplementation, |, Integer_bitOr, Dynamic, 0x22d38a06)             \
+  V(_IntegerImplementation, |, Integer_bitOr, Dynamic, 0x267fa107)             \
   V(_IntegerImplementation, _bitXorFromInteger, Integer_bitXorFromInteger,     \
     Dynamic, 0x72da93f0)                                                       \
-  V(_IntegerImplementation, ^, Integer_bitXor, Dynamic, 0x79078347)            \
+  V(_IntegerImplementation, ^, Integer_bitXor, Dynamic, 0x0c7b0230)            \
   V(_IntegerImplementation, _greaterThanFromInteger,                           \
     Integer_greaterThanFromInt, Bool, 0x4a50ed58)                              \
   V(_IntegerImplementation, >, Integer_greaterThan, Bool, 0x6599a6e1)          \
@@ -233,8 +230,8 @@
   V(_IntegerImplementation, <, Integer_lessThan, Bool, 0x365d1eba)             \
   V(_IntegerImplementation, <=, Integer_lessEqualThan, Bool, 0x74b5eb64)       \
   V(_IntegerImplementation, >=, Integer_greaterEqualThan, Bool, 0x4260c184)    \
-  V(_IntegerImplementation, <<, Integer_shl, Dynamic, 0x415da44a)              \
-  V(_IntegerImplementation, >>, Integer_sar, Dynamic, 0x6abbf70b)              \
+  V(_IntegerImplementation, <<, Integer_shl, Dynamic, 0x4db3bf69)              \
+  V(_IntegerImplementation, >>, Integer_sar, Dynamic, 0x70172b76)              \
   V(_Double, toInt, DoubleToInteger, Dynamic, 0x26ef344b)                      \
 
 #define MATH_LIB_INTRINSIC_LIST(V)                                             \
@@ -437,10 +434,15 @@
   V(::, _classRangeCheckNegative, ClassRangeCheckNegated, 0x5acdfb75)          \
   V(::, _classRangeAssert, ClassRangeAssert, 0x6c77116e)                       \
   V(::, _classIdEqualsAssert, ClassIdEqualsAssert, 0x09e0ae72)                 \
+  V(::, _toInt, ConvertMaskedInt, 0x713908fd)                                  \
+  V(::, _toInt8, ConvertIntToInt8, 0x7484a780)                                 \
+  V(::, _toUint8, ConvertIntToUint8, 0x0a15b522)                               \
+  V(::, _toClampedUint8, ConvertIntToClampedUint8, 0x564b0435)                 \
+  V(::, _toInt16, ConvertIntToInt16, 0x0a83fcc6)                               \
+  V(::, _toUint16, ConvertIntToUint16, 0x6087d1af)                             \
+  V(::, _toInt32, ConvertIntToInt32, 0x62b451b9)                               \
+  V(::, _toUint32, ConvertIntToUint32, 0x17a8e085)                             \
   V(Lists, copy, ListsCopy, 0x40e974f6)                                        \
-  V(_Bigint, get:_neg, Bigint_getNeg, 0x35608e23)                              \
-  V(_Bigint, get:_used, Bigint_getUsed, 0x33bac590)                            \
-  V(_Bigint, get:_digits, Bigint_getDigits, 0x68df70f8)                        \
   V(_HashVMBase, get:_index, LinkedHashMap_getIndex, 0x02477157)               \
   V(_HashVMBase, set:_index, LinkedHashMap_setIndex, 0x4fc8d5e0)               \
   V(_HashVMBase, get:_data, LinkedHashMap_getData, 0x2d7a70ac)                 \
@@ -468,7 +470,8 @@
   V(_BigIntImpl, _absSub, Bigint_absSub, 0x1de5bd32)                           \
   V(_BigIntImpl, _mulAdd, Bigint_mulAdd, 0x6f277966)                           \
   V(_BigIntImpl, _sqrAdd, Bigint_sqrAdd, 0x68e4c8ea)                           \
-  V(_BigIntImpl, _estimateQuotientDigit, Bigint_estQuotientDigit, 0x35456d91)  \
+  V(_BigIntImpl, _estimateQuotientDigit, Bigint_estimateQuotientDigit,         \
+    0x35456d91)                                                                \
   V(_BigIntMontgomeryReduction, _mulMod, Montgomery_mulMod, 0x0f7b0375)        \
   V(_Double, >, Double_greaterThan, 0x4f1375a3)                                \
   V(_Double, >=, Double_greaterEqualThan, 0x4260c184)                          \
@@ -479,21 +482,21 @@
   V(_Double, -, Double_sub, 0x3b69d466)                                        \
   V(_Double, *, Double_mul, 0x2bb9bd5d)                                        \
   V(_Double, /, Double_div, 0x483eee28)                                        \
-  V(_IntegerImplementation, +, Integer_add, 0x4f5804de)                        \
-  V(_IntegerImplementation, -, Integer_sub, 0x183b13bf)                        \
-  V(_IntegerImplementation, *, Integer_mul, 0x4014c3c0)                        \
-  V(_IntegerImplementation, ~/, Integer_truncDivide, 0x082b321e)               \
+  V(_IntegerImplementation, +, Integer_add, 0x43d53af7)                        \
+  V(_IntegerImplementation, -, Integer_sub, 0x2dc22e03)                        \
+  V(_IntegerImplementation, *, Integer_mul, 0x4e7a1c24)                        \
+  V(_IntegerImplementation, ~/, Integer_truncDivide, 0x4efb2d39)               \
   V(_IntegerImplementation, unary-, Integer_negate, 0x428bf6fa)                \
-  V(_IntegerImplementation, &, Integer_bitAnd, 0x32c46c28)                     \
-  V(_IntegerImplementation, |, Integer_bitOr, 0x22d38a06)                      \
-  V(_IntegerImplementation, ^, Integer_bitXor, 0x79078347)                     \
+  V(_IntegerImplementation, &, Integer_bitAnd, 0x5ab35f30)                     \
+  V(_IntegerImplementation, |, Integer_bitOr, 0x267fa107)                      \
+  V(_IntegerImplementation, ^, Integer_bitXor, 0x0c7b0230)                     \
   V(_IntegerImplementation, >, Integer_greaterThan, 0x6599a6e1)                \
   V(_IntegerImplementation, ==, Integer_equal, 0x58abc487)                     \
   V(_IntegerImplementation, <, Integer_lessThan, 0x365d1eba)                   \
   V(_IntegerImplementation, <=, Integer_lessEqualThan, 0x74b5eb64)             \
   V(_IntegerImplementation, >=, Integer_greaterEqualThan, 0x4260c184)          \
-  V(_IntegerImplementation, <<, Integer_shl, 0x415da44a)                       \
-  V(_IntegerImplementation, >>, Integer_sar, 0x6abbf70b)                       \
+  V(_IntegerImplementation, <<, Integer_shl, 0x4db3bf69)                       \
+  V(_IntegerImplementation, >>, Integer_sar, 0x70172b76)                       \
 
 // A list of core functions that internally dispatch based on received id.
 #define POLYMORPHIC_TARGET_LIST(V)                                             \
diff --git a/runtime/vm/compiler_test.cc b/runtime/vm/compiler_test.cc
index bbc4d16..c73e135 100644
--- a/runtime/vm/compiler_test.cc
+++ b/runtime/vm/compiler_test.cc
@@ -7,6 +7,7 @@
 #include "vm/class_finalizer.h"
 #include "vm/code_patcher.h"
 #include "vm/dart_api_impl.h"
+#include "vm/kernel_isolate.h"
 #include "vm/object.h"
 #include "vm/safepoint.h"
 #include "vm/symbols.h"
@@ -170,8 +171,31 @@
   expr_text = String::New("apa + ' ${calc(10)}' + dot");
   Object& val = Object::Handle();
   const Class& receiver_cls = Class::Handle(obj.clazz());
-  val = Instance::Cast(obj).Evaluate(
-      receiver_cls, expr_text, Array::empty_array(), Array::empty_array());
+
+  if (!KernelIsolate::IsRunning()) {
+    val = Instance::Cast(obj).Evaluate(
+        receiver_cls, expr_text, Array::empty_array(), Array::empty_array());
+  } else {
+    RawLibrary* raw_library = Library::RawCast(Api::UnwrapHandle(lib));
+    Library& lib_handle = Library::ZoneHandle(raw_library);
+
+    Dart_KernelCompilationResult compilation_result;
+    {
+      TransitionVMToNative transition(thread);
+      compilation_result = KernelIsolate::CompileExpressionToKernel(
+          expr_text.ToCString(), Array::empty_array(), Array::empty_array(),
+          String::Handle(lib_handle.url()).ToCString(), "A",
+          /* is_static= */ false);
+    }
+    EXPECT_EQ(Dart_KernelCompilationStatus_Ok, compilation_result.status);
+
+    const uint8_t* kernel_bytes = compilation_result.kernel;
+    intptr_t kernel_length = compilation_result.kernel_size;
+
+    val = Instance::Cast(obj).EvaluateCompiledExpression(
+        receiver_cls, kernel_bytes, kernel_length, Array::empty_array(),
+        Array::empty_array(), TypeArguments::null_type_arguments());
+  }
   EXPECT(!val.IsNull());
   EXPECT(!val.IsError());
   EXPECT(val.IsString());
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index e845697..034de31 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -43,6 +43,7 @@
 DECLARE_FLAG(bool, trace_time_all);
 DEFINE_FLAG(bool, keep_code, false, "Keep deoptimized code for profiling.");
 DEFINE_FLAG(bool, trace_shutdown, false, "Trace VM shutdown on stderr");
+DECLARE_FLAG(bool, strong);
 
 Isolate* Dart::vm_isolate_ = NULL;
 int64_t Dart::start_time_micros_ = 0;
@@ -306,7 +307,17 @@
     Service::SetGetServiceAssetsCallback(get_service_assets);
   }
 
-  ServiceIsolate::Run();
+#if defined(DART_PRECOMPILED_RUNTIME)
+  const bool is_precompiled_runtime = true;
+#else
+  const bool is_precompiled_runtime = false;
+#endif
+
+  const bool is_dart2_aot_precompiler =
+      FLAG_strong && FLAG_precompiled_mode && !is_precompiled_runtime;
+  if (!is_dart2_aot_precompiler) {
+    ServiceIsolate::Run();
+  }
 
 #ifndef DART_PRECOMPILED_RUNTIME
   if (start_kernel_isolate) {
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 88854cd..201b5b9 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -211,23 +211,7 @@
                                      int arg_index,
                                      int64_t* value) {
   ASSERT(value != NULL);
-  if (Api::GetNativeIntegerArgument(arguments, arg_index, value)) {
-    return true;
-  }
-  Thread* thread = arguments->thread();
-  ASSERT(thread == Thread::Current());
-  REUSABLE_OBJECT_HANDLESCOPE(thread);
-  Object& obj = thread->ObjectHandle();
-  obj = arguments->NativeArgAt(arg_index);
-  intptr_t cid = obj.GetClassId();
-  if (cid == kBigintCid) {
-    const Bigint& bigint = Bigint::Cast(obj);
-    if (bigint.FitsIntoInt64()) {
-      *value = bigint.AsInt64Value();
-      return true;
-    }
-  }
-  return false;
+  return Api::GetNativeIntegerArgument(arguments, arg_index, value);
 }
 
 static bool GetNativeUnsignedIntegerArgument(NativeArguments* arguments,
@@ -239,20 +223,6 @@
     *value = static_cast<uint64_t>(arg_value);
     return true;
   }
-  Thread* thread = arguments->thread();
-  ASSERT(thread == Thread::Current());
-  REUSABLE_OBJECT_HANDLESCOPE(thread);
-  Object& obj = thread->ObjectHandle();
-  obj = arguments->NativeArgAt(arg_index);
-  intptr_t cid = obj.GetClassId();
-  if (cid == kBigintCid) {
-    ASSERT(!Bigint::IsDisabled());
-    const Bigint& bigint = Bigint::Cast(obj);
-    if (bigint.FitsIntoUint64()) {
-      *value = bigint.AsUint64Value();
-      return true;
-    }
-  }
   return false;
 }
 
@@ -260,20 +230,7 @@
                                     int arg_index,
                                     double* value) {
   ASSERT(value != NULL);
-  if (Api::GetNativeDoubleArgument(arguments, arg_index, value)) {
-    return true;
-  }
-  Thread* thread = arguments->thread();
-  ASSERT(thread == Thread::Current());
-  REUSABLE_OBJECT_HANDLESCOPE(thread);
-  Object& obj = thread->ObjectHandle();
-  obj = arguments->NativeArgAt(arg_index);
-  intptr_t cid = obj.GetClassId();
-  if (cid == kBigintCid) {
-    *value = Bigint::Cast(obj).AsDoubleValue();
-    return true;
-  }
-  return false;
+  return Api::GetNativeDoubleArgument(arguments, arg_index, value);
 }
 
 static Dart_Handle GetNativeFieldsOfArgument(NativeArguments* arguments,
@@ -565,9 +522,8 @@
   intptr_t cid = raw_obj->GetClassId();
   if (cid == kExternalOneByteStringCid) {
     RawExternalOneByteString* raw_string =
-        reinterpret_cast<RawExternalOneByteString*>(raw_obj)->ptr();
-    ExternalStringData<uint8_t>* data = raw_string->external_data_;
-    *peer = data->peer();
+        reinterpret_cast<RawExternalOneByteString*>(raw_obj);
+    *peer = raw_string->ptr()->peer_;
     return true;
   }
   if (cid == kOneByteStringCid || cid == kTwoByteStringCid) {
@@ -577,9 +533,8 @@
   }
   if (cid == kExternalTwoByteStringCid) {
     RawExternalTwoByteString* raw_string =
-        reinterpret_cast<RawExternalTwoByteString*>(raw_obj)->ptr();
-    ExternalStringData<uint16_t>* data = raw_string->external_data_;
-    *peer = data->peer();
+        reinterpret_cast<RawExternalTwoByteString*>(raw_obj);
+    *peer = raw_string->ptr()->peer_;
     return true;
   }
   return false;
@@ -2116,15 +2071,11 @@
     *fits = true;
     return Api::Success();
   }
-  // Slow path for Mints and Bigints.
+  // Slow path for type error.
   DARTSCOPE(thread);
   const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer);
-  if (int_obj.IsNull()) {
-    RETURN_TYPE_ERROR(Z, integer, Integer);
-  }
-  ASSERT(!Bigint::Cast(int_obj).FitsIntoInt64());
-  *fits = false;
-  return Api::Success();
+  ASSERT(int_obj.IsNull());
+  RETURN_TYPE_ERROR(Z, integer, Integer);
 }
 
 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoUint64(Dart_Handle integer,
@@ -2138,19 +2089,14 @@
     *fits = (Api::SmiValue(integer) >= 0);
     return Api::Success();
   }
-  // Slow path for Mints and Bigints.
+  // Slow path for Mints.
   DARTSCOPE(thread);
   const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer);
   if (int_obj.IsNull()) {
     RETURN_TYPE_ERROR(Z, integer, Integer);
   }
-  ASSERT(!int_obj.IsSmi());
-  if (int_obj.IsMint()) {
-    *fits = !int_obj.IsNegative();
-  } else {
-    ASSERT(!Bigint::IsDisabled());
-    *fits = Bigint::Cast(int_obj).FitsIntoUint64();
-  }
+  ASSERT(int_obj.IsMint());
+  *fits = !int_obj.IsNegative();
   return Api::Success();
 }
 
@@ -2164,7 +2110,7 @@
     NOHANDLESCOPE(thread);
     return Api::NewHandle(thread, Smi::New(static_cast<intptr_t>(value)));
   }
-  // Slow path for Mints and Bigints.
+  // Slow path for Mints.
   DARTSCOPE(thread);
   CHECK_CALLBACK_STATE(thread);
   return Api::NewHandle(thread, Integer::New(value));
@@ -2204,26 +2150,15 @@
     *value = Api::SmiValue(integer);
     return Api::Success();
   }
-  // Slow path for Mints and Bigints.
+  // Slow path for Mints.
   DARTSCOPE(thread);
   const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer);
   if (int_obj.IsNull()) {
     RETURN_TYPE_ERROR(Z, integer, Integer);
   }
-  ASSERT(!int_obj.IsSmi());
-  if (int_obj.IsMint()) {
-    *value = int_obj.AsInt64Value();
-    return Api::Success();
-  } else {
-    ASSERT(!Bigint::IsDisabled());
-    const Bigint& bigint = Bigint::Cast(int_obj);
-    if (bigint.FitsIntoInt64()) {
-      *value = bigint.AsInt64Value();
-      return Api::Success();
-    }
-  }
-  return Api::NewError("%s: Integer %s cannot be represented as an int64_t.",
-                       CURRENT_FUNC, int_obj.ToCString());
+  ASSERT(int_obj.IsMint());
+  *value = int_obj.AsInt64Value();
+  return Api::Success();
 }
 
 DART_EXPORT Dart_Handle Dart_IntegerToUint64(Dart_Handle integer,
@@ -2239,7 +2174,7 @@
       return Api::Success();
     }
   }
-  // Slow path for Mints and Bigints.
+  // Slow path for Mints.
   DARTSCOPE(thread);
   const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer);
   if (int_obj.IsNull()) {
@@ -2247,18 +2182,12 @@
   }
   if (int_obj.IsSmi()) {
     ASSERT(int_obj.IsNegative());
-  } else if (int_obj.IsMint()) {
+  } else {
+    ASSERT(int_obj.IsMint());
     if (!int_obj.IsNegative()) {
       *value = int_obj.AsInt64Value();
       return Api::Success();
     }
-  } else {
-    ASSERT(!Bigint::IsDisabled());
-    const Bigint& bigint = Bigint::Cast(int_obj);
-    if (bigint.FitsIntoUint64()) {
-      *value = bigint.AsUint64Value();
-      return Api::Success();
-    }
   }
   return Api::NewError("%s: Integer %s cannot be represented as a uint64_t.",
                        CURRENT_FUNC, int_obj.ToCString());
@@ -2404,32 +2333,44 @@
 Dart_NewExternalLatin1String(const uint8_t* latin1_array,
                              intptr_t length,
                              void* peer,
-                             Dart_PeerFinalizer cback) {
+                             intptr_t external_allocation_size,
+                             Dart_WeakPersistentHandleFinalizer callback) {
   DARTSCOPE(Thread::Current());
   API_TIMELINE_DURATION(T);
   if (latin1_array == NULL && length != 0) {
     RETURN_NULL_ERROR(latin1_array);
   }
+  if (callback == NULL) {
+    RETURN_NULL_ERROR(callback);
+  }
   CHECK_LENGTH(length, String::kMaxElements);
   CHECK_CALLBACK_STATE(T);
-  return Api::NewHandle(T,
-                        String::NewExternal(latin1_array, length, peer, cback,
-                                            SpaceForExternal(T, length)));
+  return Api::NewHandle(
+      T,
+      String::NewExternal(latin1_array, length, peer, external_allocation_size,
+                          callback, SpaceForExternal(T, length)));
 }
 
-DART_EXPORT Dart_Handle Dart_NewExternalUTF16String(const uint16_t* utf16_array,
-                                                    intptr_t length,
-                                                    void* peer,
-                                                    Dart_PeerFinalizer cback) {
+DART_EXPORT Dart_Handle
+Dart_NewExternalUTF16String(const uint16_t* utf16_array,
+                            intptr_t length,
+                            void* peer,
+                            intptr_t external_allocation_size,
+                            Dart_WeakPersistentHandleFinalizer callback) {
   DARTSCOPE(Thread::Current());
   if (utf16_array == NULL && length != 0) {
     RETURN_NULL_ERROR(utf16_array);
   }
+  if (callback == NULL) {
+    RETURN_NULL_ERROR(callback);
+  }
   CHECK_LENGTH(length, String::kMaxElements);
   CHECK_CALLBACK_STATE(T);
   intptr_t bytes = length * sizeof(*utf16_array);
-  return Api::NewHandle(T, String::NewExternal(utf16_array, length, peer, cback,
-                                               SpaceForExternal(T, bytes)));
+  return Api::NewHandle(
+      T,
+      String::NewExternal(utf16_array, length, peer, external_allocation_size,
+                          callback, SpaceForExternal(T, bytes)));
 }
 
 DART_EXPORT Dart_Handle Dart_StringToCString(Dart_Handle object,
@@ -2666,22 +2607,11 @@
   if (retval.IsSmi()) {
     *len = Smi::Cast(retval).Value();
     return Api::Success();
-  } else if (retval.IsMint() || retval.IsBigint()) {
-    if (retval.IsMint()) {
-      int64_t mint_value = Mint::Cast(retval).value();
-      if (mint_value >= kIntptrMin && mint_value <= kIntptrMax) {
-        *len = static_cast<intptr_t>(mint_value);
-      }
-    } else {
-      // Check for a non-canonical Mint range value.
-      ASSERT(retval.IsBigint());
-      const Bigint& bigint = Bigint::Handle();
-      if (bigint.FitsIntoInt64()) {
-        int64_t bigint_value = bigint.AsInt64Value();
-        if (bigint_value >= kIntptrMin && bigint_value <= kIntptrMax) {
-          *len = static_cast<intptr_t>(bigint_value);
-        }
-      }
+  } else if (retval.IsMint()) {
+    int64_t mint_value = Mint::Cast(retval).value();
+    if (mint_value >= kIntptrMin && mint_value <= kIntptrMax) {
+      *len = static_cast<intptr_t>(mint_value);
+      return Api::Success();
     }
     return Api::NewError(
         "Length of List object is greater than the "
@@ -5087,7 +5017,7 @@
   if (Smi::IsValid(retval)) {
     Api::SetSmiReturnValue(arguments, static_cast<intptr_t>(retval));
   } else {
-    // Slow path for Mints and Bigints.
+    // Slow path for Mints.
     ASSERT_CALLBACK_STATE(arguments->thread());
     TransitionNativeToVM transition(arguments->thread());
     Api::SetIntegerReturnValue(arguments, retval);
@@ -5316,7 +5246,7 @@
   CHECK_COMPILATION_ALLOWED(I);
 
   kernel::Program* program = kernel::Program::ReadFromBuffer(
-      buffer, buffer_size, false /* take_buffer_ownership */);
+      buffer, buffer_size, /*take_buffer_ownership=*/false);
   const Object& tmp = kernel::KernelLoader::LoadEntireProgram(program);
   delete program;
 
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 5867cf5..7569556 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -908,30 +908,10 @@
   EXPECT_EQ(kIntegerVal2, out);
 
   Dart_Handle val3 = Dart_NewIntegerFromHexCString(kIntegerVal3);
-  if (FLAG_limit_ints_to_64_bits) {
-    EXPECT(Dart_IsApiError(val3));
-  } else {
-    EXPECT(Dart_IsInteger(val3));
-    result = Dart_IntegerFitsIntoInt64(val3, &fits);
-    EXPECT_VALID(result);
-    EXPECT(!fits);
-
-    const char* chars = NULL;
-    result = Dart_IntegerToHexCString(val3, &chars);
-    EXPECT_VALID(result);
-    EXPECT(!strcmp(kIntegerVal3, chars));
-  }
+  EXPECT(Dart_IsApiError(val3));
 
   Dart_Handle val4 = Dart_NewIntegerFromUint64(kIntegerVal4);
-  if (FLAG_limit_ints_to_64_bits) {
-    EXPECT(Dart_IsApiError(val4));
-  } else {
-    EXPECT_VALID(val4);
-    uint64_t out4 = 0;
-    result = Dart_IntegerToUint64(val4, &out4);
-    EXPECT_VALID(result);
-    EXPECT_EQ(kIntegerVal4, out4);
-  }
+  EXPECT(Dart_IsApiError(val4));
 
   Dart_Handle val5 = Dart_NewInteger(-1);
   EXPECT_VALID(val5);
@@ -972,29 +952,6 @@
     EXPECT_VALID(result);
     EXPECT_STREQ(kIntTestCases[i].s, chars);
   }
-
-  if (!FLAG_limit_ints_to_64_bits) {
-    const char* kStrTestCases[] = {
-        "0x8000000000000000",
-        "-0x8000000000000000",
-        "0xFFFFFFFFFFFFFFFF",
-        "-0xFFFFFFFFFFFFFFFF",
-        "0xAABBCCDDEEFF00112233445566778899",
-        "-0x1234567890ABCDEF1234567890ABCDEF",
-    };
-
-    const size_t kNumberOfStrTestCases =
-        sizeof(kStrTestCases) / sizeof(kStrTestCases[0]);
-
-    for (size_t i = 0; i < kNumberOfStrTestCases; ++i) {
-      Dart_Handle val = Dart_NewIntegerFromHexCString(kStrTestCases[i]);
-      EXPECT_VALID(val);
-      const char* chars = NULL;
-      Dart_Handle result = Dart_IntegerToHexCString(val, &chars);
-      EXPECT_VALID(result);
-      EXPECT_STREQ(kStrTestCases[i], chars);
-    }
-  }
 }
 
 TEST_CASE(DartAPI_IntegerFitsIntoInt64) {
@@ -1006,15 +963,7 @@
   EXPECT(fits);
 
   Dart_Handle above_max = Dart_NewIntegerFromHexCString("0x10000000000000000");
-  if (FLAG_limit_ints_to_64_bits) {
-    EXPECT(Dart_IsApiError(above_max));
-  } else {
-    EXPECT(Dart_IsInteger(above_max));
-    fits = true;
-    result = Dart_IntegerFitsIntoInt64(above_max, &fits);
-    EXPECT_VALID(result);
-    EXPECT(!fits);
-  }
+  EXPECT(Dart_IsApiError(above_max));
 
   Dart_Handle min = Dart_NewInteger(kMinInt64);
   EXPECT(Dart_IsInteger(min));
@@ -1024,39 +973,15 @@
   EXPECT(fits);
 
   Dart_Handle below_min = Dart_NewIntegerFromHexCString("-0x10000000000000001");
-  if (FLAG_limit_ints_to_64_bits) {
-    EXPECT(Dart_IsApiError(below_min));
-  } else {
-    EXPECT(Dart_IsInteger(below_min));
-    fits = true;
-    result = Dart_IntegerFitsIntoInt64(below_min, &fits);
-    EXPECT_VALID(result);
-    EXPECT(!fits);
-  }
+  EXPECT(Dart_IsApiError(below_min));
 }
 
 TEST_CASE(DartAPI_IntegerFitsIntoUint64) {
   Dart_Handle max = Dart_NewIntegerFromUint64(kMaxUint64);
-  if (FLAG_limit_ints_to_64_bits) {
-    EXPECT(Dart_IsApiError(max));
-  } else {
-    EXPECT(Dart_IsInteger(max));
-    bool fits = false;
-    Dart_Handle result = Dart_IntegerFitsIntoUint64(max, &fits);
-    EXPECT_VALID(result);
-    EXPECT(fits);
-  }
+  EXPECT(Dart_IsApiError(max));
 
   Dart_Handle above_max = Dart_NewIntegerFromHexCString("0x10000000000000000");
-  if (FLAG_limit_ints_to_64_bits) {
-    EXPECT(Dart_IsApiError(above_max));
-  } else {
-    EXPECT(Dart_IsInteger(above_max));
-    bool fits = true;
-    Dart_Handle result = Dart_IntegerFitsIntoUint64(above_max, &fits);
-    EXPECT_VALID(result);
-    EXPECT(!fits);
-  }
+  EXPECT(Dart_IsApiError(above_max));
 
   Dart_Handle min = Dart_NewInteger(0);
   EXPECT(Dart_IsInteger(min));
@@ -1109,6 +1034,10 @@
   }
 }
 
+static void NoopFinalizer(void* isolate_callback_data,
+                          Dart_WeakPersistentHandle handle,
+                          void* peer) {}
+
 TEST_CASE(DartAPI_IsString) {
   uint8_t latin1[] = {'o', 'n', 'e', 0xC2, 0xA2};
 
@@ -1147,8 +1076,8 @@
     EXPECT_EQ(data8[i], latin1_array[i]);
   }
 
-  Dart_Handle ext8 =
-      Dart_NewExternalLatin1String(data8, ARRAY_SIZE(data8), data8, NULL);
+  Dart_Handle ext8 = Dart_NewExternalLatin1String(
+      data8, ARRAY_SIZE(data8), data8, sizeof(data8), NoopFinalizer);
   EXPECT_VALID(ext8);
   EXPECT(Dart_IsString(ext8));
   EXPECT(Dart_IsExternalString(ext8));
@@ -1169,8 +1098,8 @@
   EXPECT_EQ(4, str_len);
   EXPECT(!peer);
 
-  Dart_Handle ext16 =
-      Dart_NewExternalUTF16String(data16, ARRAY_SIZE(data16), data16, NULL);
+  Dart_Handle ext16 = Dart_NewExternalUTF16String(
+      data16, ARRAY_SIZE(data16), data16, sizeof(data16), NoopFinalizer);
   EXPECT_VALID(ext16);
   EXPECT(Dart_IsString(ext16));
   EXPECT(Dart_IsExternalString(ext16));
@@ -1273,7 +1202,9 @@
   }
 };
 
-static void ExternalStringCallbackFinalizer(void* peer) {
+static void ExternalStringCallbackFinalizer(void* isolate_callback_data,
+                                            Dart_WeakPersistentHandle handle,
+                                            void* peer) {
   *static_cast<int*>(peer) *= 2;
 }
 
@@ -1286,12 +1217,14 @@
 
     uint8_t data8[] = {'h', 'e', 'l', 'l', 'o'};
     Dart_Handle obj8 = Dart_NewExternalLatin1String(
-        data8, ARRAY_SIZE(data8), &peer8, ExternalStringCallbackFinalizer);
+        data8, ARRAY_SIZE(data8), &peer8, sizeof(data8),
+        ExternalStringCallbackFinalizer);
     EXPECT_VALID(obj8);
 
     uint16_t data16[] = {'h', 'e', 'l', 'l', 'o'};
     Dart_Handle obj16 = Dart_NewExternalUTF16String(
-        data16, ARRAY_SIZE(data16), &peer16, ExternalStringCallbackFinalizer);
+        data16, ARRAY_SIZE(data16), &peer16, sizeof(data16),
+        ExternalStringCallbackFinalizer);
     EXPECT_VALID(obj16);
 
     Dart_ExitScope();
@@ -1318,21 +1251,25 @@
     static const uint8_t big_data8[16 * MB] = {
         0,
     };
-    Dart_Handle big8 = Dart_NewExternalLatin1String(
-        big_data8, ARRAY_SIZE(big_data8), NULL, NULL);
+    Dart_Handle big8 =
+        Dart_NewExternalLatin1String(big_data8, ARRAY_SIZE(big_data8), NULL,
+                                     sizeof(big_data8), NoopFinalizer);
     EXPECT_VALID(big8);
     static const uint16_t big_data16[16 * MB / 2] = {
         0,
     };
-    Dart_Handle big16 = Dart_NewExternalUTF16String(
-        big_data16, ARRAY_SIZE(big_data16), NULL, NULL);
+    Dart_Handle big16 =
+        Dart_NewExternalUTF16String(big_data16, ARRAY_SIZE(big_data16), NULL,
+                                    sizeof(big_data16), NoopFinalizer);
     static const uint8_t small_data8[] = {'f', 'o', 'o'};
-    Dart_Handle small8 = Dart_NewExternalLatin1String(
-        small_data8, ARRAY_SIZE(small_data8), NULL, NULL);
+    Dart_Handle small8 =
+        Dart_NewExternalLatin1String(small_data8, ARRAY_SIZE(small_data8), NULL,
+                                     sizeof(small_data8), NoopFinalizer);
     EXPECT_VALID(small8);
     static const uint16_t small_data16[] = {'b', 'a', 'r'};
-    Dart_Handle small16 = Dart_NewExternalUTF16String(
-        small_data16, ARRAY_SIZE(small_data16), NULL, NULL);
+    Dart_Handle small16 =
+        Dart_NewExternalUTF16String(small_data16, ARRAY_SIZE(small_data16),
+                                    NULL, sizeof(small_data16), NoopFinalizer);
     EXPECT_VALID(small16);
     {
       CHECK_API_SCOPE(thread);
@@ -4408,43 +4345,6 @@
   EXPECT(Dart_IsError(result));
 }
 
-TEST_CASE(DartAPI_NegativeNativeFieldInIsolateMessage) {
-  const char* kScriptChars =
-      "import 'dart:isolate';\n"
-      "import 'dart:nativewrappers';\n"
-      "echo(msg) {\n"
-      "  var data = msg[0];\n"
-      "  var reply = msg[1];\n"
-      "  reply.send('echoing ${data(1)}}');\n"
-      "}\n"
-      "class Test extends NativeFieldWrapperClass2 {\n"
-      "  Test(this.i, this.j);\n"
-      "  int i, j;\n"
-      "}\n"
-      "main() {\n"
-      "  var port = new RawReceivePort();\n"
-      "  var obj = new Test(1,2);\n"
-      "  var msg = [obj, port.sendPort];\n"
-      "  var snd = Isolate.spawn(echo, msg);\n"
-      "  port.handler = (msg) {\n"
-      "    port.close();\n"
-      "    print('from worker ${msg}');\n"
-      "  };\n"
-      "}\n";
-
-  CHECK_API_SCOPE(thread);
-  HANDLESCOPE(thread);
-
-  // Create a test library and Load up a test script in it.
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-
-  // Invoke 'main' which should spawn an isolate and try to send an
-  // object with native fields over to the spawned isolate. This
-  // should result in an unhandled exception which is checked.
-  Dart_Handle retobj = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT(Dart_IsError(retobj));
-}
-
 TEST_CASE(DartAPI_GetStaticField_RunsInitializer) {
   const char* kScriptChars =
       "class TestClass  {\n"
@@ -5312,14 +5212,8 @@
 
     EXPECT(arg_values[1].as_int32 == 77);
 
-    // Note: this particular value is chosen for the following reasons.
-    // 1) When wrapped-around, it should not fit into int32, because this unit
-    // test verifies that getting it as int32 produces error.
-    // 2) It should be large enough to exercise Bigints with unlimited ints, so
-    // it should be > MaxInt64.
-    // Given these constraints, any value between MaxInt64+1 and
-    // MaxUint64-MaxInt32-1 would work. Value 0x8000000000000000 is in this
-    // range and easy to produce without using a large integer literal.
+    // When wrapped-around, this value should not fit into int32, because this
+    // unit test verifies that getting it as int32 produces error.
     EXPECT(arg_values[2].as_uint64 == 0x8000000000000000LL);
 
     EXPECT(arg_values[3].as_bool == true);
@@ -5423,7 +5317,7 @@
       "  MyObject obj1 = MyObject.createObject();"
       "  MyObject obj2 = MyObject.createObject();"
       "  return obj1.accessFields(77,"
-      "                           1 << 63,"
+      "                           0x8000000000000000,"
       "                           true,"
       "                           3.14,"
       "                           str,"
@@ -5436,9 +5330,11 @@
       reinterpret_cast<Dart_NativeEntryResolver>(native_args_lookup));
 
   const char* ascii_str = "string";
+  intptr_t ascii_str_length = strlen(ascii_str);
   Dart_Handle extstr = Dart_NewExternalLatin1String(
-      reinterpret_cast<const uint8_t*>(ascii_str), strlen(ascii_str),
-      reinterpret_cast<void*>(&native_arg_str_peer), NULL);
+      reinterpret_cast<const uint8_t*>(ascii_str), ascii_str_length,
+      reinterpret_cast<void*>(&native_arg_str_peer), ascii_str_length,
+      NoopFinalizer);
 
   Dart_Handle args[1];
   args[0] = extstr;
@@ -7613,13 +7509,7 @@
   EXPECT(Dart_IsError(Dart_SetPeer(smi, &out)));
   out = &out;
   Dart_Handle big = Dart_NewIntegerFromHexCString("0x10000000000000000");
-  if (FLAG_limit_ints_to_64_bits) {
-    EXPECT(Dart_IsApiError(big));
-  } else {
-    EXPECT(Dart_IsError(Dart_GetPeer(big, &out)));
-    EXPECT(out == &out);
-    EXPECT(Dart_IsError(Dart_SetPeer(big, &out)));
-  }
+  EXPECT(Dart_IsApiError(big));
   out = &out;
   Dart_Handle dbl = Dart_NewDouble(0.0);
   EXPECT(Dart_IsError(Dart_GetPeer(dbl, &out)));
@@ -8056,8 +7946,8 @@
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
   uint8_t data8[] = {'W'};
-  Dart_Handle ext8 =
-      Dart_NewExternalLatin1String(data8, ARRAY_SIZE(data8), data8, NULL);
+  Dart_Handle ext8 = Dart_NewExternalLatin1String(
+      data8, ARRAY_SIZE(data8), data8, sizeof(data8), NoopFinalizer);
   EXPECT_VALID(ext8);
   EXPECT(Dart_IsString(ext8));
   EXPECT(Dart_IsExternalString(ext8));
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index f28e915..aeb24be 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -101,19 +101,6 @@
 
 _Dart_CObject* ApiMessageReader::singleton_uint32_typed_data_ = NULL;
 
-Dart_CObject* ApiMessageReader::AllocateDartCObjectBigint() {
-  Dart_CObject* value = AllocateDartCObject(Dart_CObject_kBigint);
-  value->value.as_bigint.neg = false;
-  value->value.as_bigint.used = 0;
-  if (singleton_uint32_typed_data_ == NULL) {
-    singleton_uint32_typed_data_ =
-        AllocateDartCObjectTypedData(Dart_TypedData_kUint32, 0);
-  }
-  value->value.as_bigint.digits = singleton_uint32_typed_data_;
-  value->type = Dart_CObject_kBigint;
-  return value;
-}
-
 Dart_CObject* ApiMessageReader::AllocateDartCObjectDouble(double val) {
   Dart_CObject* value = AllocateDartCObject(Dart_CObject_kDouble);
   value->value.as_double = val;
@@ -572,27 +559,6 @@
       AddBackRef(object_id, object, kIsDeserialized);
       return object;
     }
-    case kBigintCid: {
-      // Allocate an empty bigint which will be updated when its contents
-      // has been deserialized.
-      Dart_CObject* object = AllocateDartCObjectBigint();
-      AddBackRef(object_id, object, kIsDeserialized);
-      Dart_CObject* neg_obj = ReadObjectImpl();
-      ASSERT(neg_obj->type == Dart_CObject_kBool);
-      const bool neg = neg_obj->value.as_bool;
-      Dart_CObject* used_obj = ReadObjectImpl();
-      ASSERT(used_obj->type == Dart_CObject_kInt32);
-      const intptr_t used = used_obj->value.as_int32;
-      Dart_CObject* digits = ReadObjectImpl();
-      ASSERT(digits->type == Dart_CObject_kTypedData);
-      ASSERT(digits->value.as_typed_data.type == Dart_TypedData_kUint32);
-      ASSERT(digits->value.as_typed_data.length >= 4 * used);
-      // Update the bigint object.
-      object->value.as_bigint.neg = neg;
-      object->value.as_bigint.used = used;
-      object->value.as_bigint.digits = digits;
-      return object;
-    }
     case kDoubleCid: {
       // Doubles are handled specially when being sent as part of message
       // snapshots.
@@ -1092,24 +1058,6 @@
     case Dart_CObject_kInt64:
       WriteInt64(object);
       break;
-    case Dart_CObject_kBigint: {
-      // Write out the serialization header value for this object.
-      WriteInlinedHeader(object);
-      // Write out the class and tags information.
-      WriteIndexedObject(kBigintCid);
-      WriteTags(0);
-      // Write neg field.
-      if (object->value.as_bigint.neg) {
-        WriteVMIsolateObject(kTrueValue);
-      } else {
-        WriteVMIsolateObject(kFalseValue);
-      }
-      // Write used field.
-      WriteSmi(object->value.as_bigint.used);
-      // Write digits as TypedData (or NullObject).
-      WriteCObject(object->value.as_bigint.digits);
-      break;
-    }
     case Dart_CObject_kDouble:
       WriteVMIsolateObject(kDoubleObject);
       WriteDouble(object->value.as_double);
diff --git a/runtime/vm/dart_api_message.h b/runtime/vm/dart_api_message.h
index 9c9a3ab..082fc08 100644
--- a/runtime/vm/dart_api_message.h
+++ b/runtime/vm/dart_api_message.h
@@ -84,8 +84,6 @@
   Dart_CObject* AllocateDartCObjectInt32(int32_t value);
   // Allocates a Dart_CObject object for for a 64-bit integer.
   Dart_CObject* AllocateDartCObjectInt64(int64_t value);
-  // Allocates an empty Dart_CObject object for a bigint to be filled up later.
-  Dart_CObject* AllocateDartCObjectBigint();
   // Allocates a Dart_CObject object for a double.
   Dart_CObject* AllocateDartCObjectDouble(double value);
   // Allocates a Dart_CObject object for string data.
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 2d50aad..c157f1a 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -25,6 +25,16 @@
 RawObject* DartEntry::InvokeFunction(const Function& function,
                                      const Array& arguments) {
   ASSERT(Thread::Current()->IsMutatorThread());
+
+  // We use a kernel2kernel constant evaluator in Dart 2.0 AOT compilation
+  // and never start the VM service isolate. So we should never end up invoking
+  // any dart code in the Dart 2.0 AOT compiler.
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  if (Isolate::Current()->strong() && FLAG_precompiled_mode) {
+    UNREACHABLE();
+  }
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+
   const int kTypeArgsLen = 0;  // No support to pass type args to generic func.
   const Array& arguments_descriptor =
       Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, arguments.Length()));
@@ -52,11 +62,15 @@
     ASSERT(os_thread != NULL);
     os_thread->RefineStackBoundsFromSP(current_sp);
 
-    // Save the Thread's current stack limit and adjust the stack
-    // limit based on the thread's stack_base.
+    // Save the Thread's current stack limit and adjust the stack limit.
     ASSERT(thread->isolate() == Isolate::Current());
     saved_stack_limit_ = thread->saved_stack_limit();
-    thread->SetStackLimitFromStackBase(os_thread->stack_base());
+#if defined(USING_SIMULATOR)
+    thread->SetStackLimit(Simulator::Current()->stack_limit());
+#else
+    thread->SetStackLimit(OSThread::Current()->stack_limit_with_headroom());
+    // TODO(regis): For now, the interpreter is using its own stack limit.
+#endif
 
 #if defined(USING_SAFE_STACK)
     saved_safestack_limit_ = OSThread::GetCurrentSafestackPointer();
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index f6587d6..e922ec77 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -260,7 +260,16 @@
       vars_initialized_(false),
       var_descriptors_(LocalVarDescriptors::ZoneHandle()),
       desc_indices_(8),
-      pc_desc_(PcDescriptors::ZoneHandle()) {}
+      pc_desc_(PcDescriptors::ZoneHandle()) {
+  // TODO(regis): If debugging of interpreted code is required, recognize an
+  // interpreted activation frame and respect alternate frame layout.
+  // For now, punt.
+#if defined(DART_USE_INTERPRETER)
+  if (function_.Bytecode() == code_.raw()) {
+    UNIMPLEMENTED();
+  }
+#endif
+}
 
 ActivationFrame::ActivationFrame(Kind kind)
     : pc_(0),
@@ -732,15 +741,16 @@
       if (!live_frame_) {
         ASSERT(kind == RawLocalVarDescriptors::kContextVar);
       }
+      const auto variable_index = VariableIndex(var_info.index());
       if (kind == RawLocalVarDescriptors::kStackVar) {
-        return GetStackVar(var_info.index());
+        return GetStackVar(variable_index);
       } else {
         ASSERT(kind == RawLocalVarDescriptors::kContextVar);
         if (!live_frame_) {
           ASSERT(!ctx_.IsNull());
-          return ctx_.At(var_info.index());
+          return ctx_.At(variable_index.value());
         }
-        return GetContextVar(var_info.scope_id, var_info.index());
+        return GetContextVar(var_info.scope_id, variable_index.value());
       }
     }
   }
@@ -959,7 +969,8 @@
         OS::PrintErr("\tFound saved current ctx at index %d\n",
                      var_info.index());
       }
-      obj = GetStackVar(var_info.index());
+      const auto variable_index = VariableIndex(var_info.index());
+      obj = GetStackVar(variable_index);
       if (obj.IsClosure()) {
         ASSERT(function().name() == Symbols::Call().raw());
         ASSERT(function().IsInvokeFieldDispatcher());
@@ -984,11 +995,12 @@
     var_descriptors_.GetInfo(i, &var_info);
     if (var_descriptors_.GetName(i) == Symbols::AsyncOperation().raw()) {
       const int8_t kind = var_info.kind();
+      const auto variable_index = VariableIndex(var_info.index());
       if (kind == RawLocalVarDescriptors::kStackVar) {
-        return GetStackVar(var_info.index());
+        return GetStackVar(variable_index);
       } else {
         ASSERT(kind == RawLocalVarDescriptors::kContextVar);
-        return GetContextVar(var_info.scope_id, var_info.index());
+        return GetContextVar(var_info.scope_id, variable_index.value());
       }
     }
   }
@@ -1099,8 +1111,9 @@
     // can be in a number of places in the caller's frame depending on how many
     // were actually supplied at the call site, but they are copied to a fixed
     // place in the callee's frame.
+
     return GetVariableValue(
-        LocalVarAddress(fp(), (kFirstLocalSlotFromFp - index)));
+        LocalVarAddress(fp(), FrameSlotForVariableIndex(-index)));
   } else {
     intptr_t reverse_index = num_parameters - index;
     return GetVariableValue(ParamAddress(fp(), reverse_index));
@@ -1112,7 +1125,8 @@
   return GetParameter(0);
 }
 
-RawObject* ActivationFrame::GetStackVar(intptr_t slot_index) {
+RawObject* ActivationFrame::GetStackVar(VariableIndex variable_index) {
+  const intptr_t slot_index = FrameSlotForVariableIndex(variable_index.value());
   if (deopt_frame_.IsNull()) {
     return GetVariableValue(LocalVarAddress(fp(), slot_index));
   } else {
@@ -1208,11 +1222,12 @@
   *visible_end_token_pos = var_info.end_pos;
   ASSERT(value != NULL);
   const int8_t kind = var_info.kind();
+  const auto variable_index = VariableIndex(var_info.index());
   if (kind == RawLocalVarDescriptors::kStackVar) {
-    *value = GetStackVar(var_info.index());
+    *value = GetStackVar(variable_index);
   } else {
     ASSERT(kind == RawLocalVarDescriptors::kContextVar);
-    *value = GetContextVar(var_info.scope_id, var_info.index());
+    *value = GetContextVar(var_info.scope_id, variable_index.value());
   }
 }
 
@@ -1286,22 +1301,48 @@
   return (var_name.Length() >= 1) && (var_name.CharAt(0) == '_');
 }
 
-RawObject* ActivationFrame::Evaluate(const String& expr,
-                                     const GrowableObjectArray& param_names,
-                                     const GrowableObjectArray& param_values) {
+RawObject* ActivationFrame::EvaluateCompiledExpression(
+    const uint8_t* kernel_bytes,
+    intptr_t kernel_length,
+    const Array& type_definitions,
+    const Array& arguments,
+    const TypeArguments& type_arguments) {
+  if (function().is_static()) {
+    const Class& cls = Class::Handle(function().Owner());
+    return cls.EvaluateCompiledExpression(kernel_bytes, kernel_length,
+                                          type_definitions, arguments,
+                                          type_arguments);
+  } else {
+    const Object& receiver = Object::Handle(GetReceiver());
+    const Class& method_cls = Class::Handle(function().origin());
+    ASSERT(receiver.IsInstance() || receiver.IsNull());
+    if (!(receiver.IsInstance() || receiver.IsNull())) {
+      return Object::null();
+    }
+    const Instance& inst = Instance::Cast(receiver);
+    return inst.EvaluateCompiledExpression(method_cls, kernel_bytes,
+                                           kernel_length, type_definitions,
+                                           arguments, type_arguments);
+  }
+}
+
+RawTypeArguments* ActivationFrame::BuildParameters(
+    const GrowableObjectArray& param_names,
+    const GrowableObjectArray& param_values,
+    const GrowableObjectArray& type_params_names) {
   GetDescIndices();
   bool type_arguments_available = false;
-  TypeArguments& type_arguments = TypeArguments::Handle();
   String& name = String::Handle();
   String& existing_name = String::Handle();
   Object& value = Instance::Handle();
+  TypeArguments& type_arguments = TypeArguments::Handle();
   intptr_t num_variables = desc_indices_.length();
   for (intptr_t i = 0; i < num_variables; i++) {
     TokenPosition ignore;
     VariableAt(i, &name, &ignore, &ignore, &ignore, &value);
     if (name.Equals(Symbols::FunctionTypeArgumentsVar())) {
       type_arguments_available = true;
-      type_arguments = TypeArguments::RawCast(value.raw());
+      type_arguments ^= value.raw();
     } else if (!name.Equals(Symbols::This()) &&
                !IsSyntheticVariableName(name)) {
       if (IsPrivateVariableName(name)) {
@@ -1325,15 +1366,14 @@
     }
   }
 
-  Array& type_param_names = Array::Handle();
   if ((function().IsGeneric() || function().HasGenericParent()) &&
       type_arguments_available) {
     intptr_t num_vars =
         function().NumTypeParameters() + function().NumParentTypeParameters();
-    type_param_names = Array::New(num_vars);
+    type_params_names.Grow(num_vars);
+    type_params_names.SetLength(num_vars);
     TypeArguments& type_params = TypeArguments::Handle();
     TypeParameter& type_param = TypeParameter::Handle();
-    String& name = String::Handle();
     Function& current = Function::Handle(function().raw());
     for (intptr_t i = 0; !current.IsNull(); i += current.NumTypeParameters(),
                   current = current.parent_function()) {
@@ -1343,26 +1383,41 @@
         name = type_param.Name();
         // Write the names in backwards so they match up with the order of the
         // types in 'type_arguments'.
-        type_param_names.SetAt(num_vars - (i + j) - 1, name);
+        type_params_names.SetAt(num_vars - (i + j) - 1, name);
       }
     }
-    if (type_arguments.IsNull()) {
-      type_arguments = TypeArguments::New(num_vars);
-      for (intptr_t i = 0; i < num_vars; ++i) {
-        type_arguments.SetTypeAt(i, Object::dynamic_type());
+    if (!type_arguments.IsNull()) {
+      if (type_arguments.Length() == 0) {
+        for (intptr_t i = 0; i < num_vars; ++i) {
+          type_arguments.SetTypeAt(i, Object::dynamic_type());
+        }
       }
+      ASSERT(type_arguments.Length() == num_vars);
     }
-    ASSERT(type_arguments.Length() == num_vars);
-  } else {
-    type_param_names = Object::empty_array().raw();
   }
 
+  return type_arguments.raw();
+}
+
+RawObject* ActivationFrame::Evaluate(const String& expr,
+                                     const GrowableObjectArray& param_names,
+                                     const GrowableObjectArray& param_values) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+  return Object::null();
+#else
+  Zone* zone = Thread::Current()->zone();
+  const GrowableObjectArray& type_params_names =
+      GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
+  TypeArguments& type_arguments = TypeArguments::Handle(
+      zone, BuildParameters(param_names, param_values, type_params_names));
+
   if (function().is_static()) {
     const Class& cls = Class::Handle(function().Owner());
-    return cls.Evaluate(expr,
-                        Array::Handle(Array::MakeFixedLength(param_names)),
-                        Array::Handle(Array::MakeFixedLength(param_values)),
-                        type_param_names, type_arguments);
+    return cls.Evaluate(
+        expr, Array::Handle(zone, Array::MakeFixedLength(param_names)),
+        Array::Handle(zone, Array::MakeFixedLength(param_values)),
+        Array::Handle(zone, Array::MakeFixedLength(type_params_names)),
+        type_arguments);
   } else {
     const Object& receiver = Object::Handle(GetReceiver());
     const Class& method_cls = Class::Handle(function().origin());
@@ -1371,13 +1426,14 @@
       return Object::null();
     }
     const Instance& inst = Instance::Cast(receiver);
-    return inst.Evaluate(method_cls, expr,
-                         Array::Handle(Array::MakeFixedLength(param_names)),
-                         Array::Handle(Array::MakeFixedLength(param_values)),
-                         type_param_names, type_arguments);
+    return inst.Evaluate(
+        method_cls, expr,
+        Array::Handle(zone, Array::MakeFixedLength(param_names)),
+        Array::Handle(zone, Array::MakeFixedLength(param_values)),
+        Array::Handle(zone, Array::MakeFixedLength(type_params_names)),
+        type_arguments);
   }
-  UNREACHABLE();
-  return Object::null();
+#endif
 }
 
 const char* ActivationFrame::ToCString() {
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index b88d742..fedfed1 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -7,8 +7,10 @@
 
 #include "include/dart_tools_api.h"
 
+#include "vm/kernel_isolate.h"
 #include "vm/object.h"
 #include "vm/port.h"
+#include "vm/scopes.h"
 #include "vm/service_event.h"
 #include "vm/simulator.h"
 
@@ -325,10 +327,21 @@
   const Context& GetSavedCurrentContext();
   RawObject* GetAsyncOperation();
 
+  RawTypeArguments* BuildParameters(
+      const GrowableObjectArray& param_names,
+      const GrowableObjectArray& param_values,
+      const GrowableObjectArray& type_params_names);
+
   RawObject* Evaluate(const String& expr,
                       const GrowableObjectArray& names,
                       const GrowableObjectArray& values);
 
+  RawObject* EvaluateCompiledExpression(const uint8_t* kernel_bytes,
+                                        intptr_t kernel_length,
+                                        const Array& arguments,
+                                        const Array& type_definitions,
+                                        const TypeArguments& type_arguments);
+
   // Print the activation frame into |jsobj|. if |full| is false, script
   // and local variable objects are only references. if |full| is true,
   // the complete script, function, and, local variable objects are included.
@@ -380,7 +393,7 @@
     }
   }
 
-  RawObject* GetStackVar(intptr_t slot_index);
+  RawObject* GetStackVar(VariableIndex var_index);
   RawObject* GetContextVar(intptr_t ctxt_level, intptr_t slot_index);
 
   uword pc_;
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index ee069b2..1694109 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -1016,9 +1016,9 @@
 
 intptr_t DeoptInfoBuilder::CalculateStackIndex(
     const Location& source_loc) const {
-  return source_loc.stack_index() < 0
-             ? source_loc.stack_index() + num_args_
-             : source_loc.stack_index() + num_args_ + kDartFrameFixedSize;
+  intptr_t index = -VariableIndexForFrameSlot(source_loc.stack_index());
+  return index < 0 ? index + num_args_
+                   : index + num_args_ + kDartFrameFixedSize;
 }
 
 CpuRegisterSource DeoptInfoBuilder::ToCpuRegisterSource(const Location& loc) {
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index c5bfcce..d1b1606 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -466,6 +466,15 @@
   Simulator::Current()->JumpToFrame(program_counter, stack_pointer,
                                     frame_pointer, thread);
 #else
+#if defined(DART_USE_INTERPRETER)
+  Interpreter* interpreter = thread->isolate()->interpreter();
+  if ((interpreter != NULL) && interpreter->HasFrame(frame_pointer)) {
+    interpreter->JumpToFrame(program_counter, stack_pointer, frame_pointer,
+                             thread);
+  }
+  // TODO(regis): We still possibly need to unwind interpreter frames if they
+  // are callee frames of the C++ frame handling the exception.
+#endif
   // Prepare for unwinding frames by destroying all the stack resources
   // in the previous frames.
   StackResource::Unwind(thread);
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index 36452aa..432e3d3 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -83,9 +83,6 @@
     "Report error for bad overrides. Ignored in strong mode.")                 \
   R(error_on_bad_type, false, bool, false,                                     \
     "Report error for malformed types.")                                       \
-  P(external_max_size, int, (kWordSize <= 4) ? 512 : 1024,                     \
-    "Max total size of external allocations in MB, or 0 for unlimited,"        \
-    "e.g: --external_max_size=1024 allows up to 1024MB of externals")          \
   P(fields_may_be_reset, bool, false,                                          \
     "Don't optimize away static field initialization")                         \
   C(force_clone_compiler_objects, false, false, bool, false,                   \
@@ -104,7 +101,6 @@
   P(interpret_irregexp, bool, USING_DBC, "Use irregexp bytecode interpreter")  \
   P(lazy_dispatchers, bool, true, "Generate dispatchers lazily")               \
   P(link_natives_lazily, bool, false, "Link native calls lazily")              \
-  P(limit_ints_to_64_bits, bool, true, "Truncate integers to 64 bits")         \
   C(load_deferred_eagerly, true, true, bool, false,                            \
     "Load deferred libraries eagerly.")                                        \
   R(log_marker_tasks, false, bool, false,                                      \
@@ -116,8 +112,6 @@
     "Maximum number of polymorphic check, otherwise it is megamorphic.")       \
   P(max_equality_polymorphic_checks, int, 32,                                  \
     "Maximum number of polymorphic checks in equality operator,")              \
-  P(new_gen_ext_limit, int, 64,                                                \
-    "maximum total external size (MB) in new gen before triggering GC")        \
   P(new_gen_semi_max_size, int, (kWordSize <= 4) ? 16 : 32,                    \
     "Max size of new gen semi space in MB")                                    \
   P(optimization_counter_threshold, int, 30000,                                \
@@ -157,7 +151,7 @@
   C(stress_async_stacks, false, false, bool, false,                            \
     "Stress test async stack traces")                                          \
   P(strong, bool, false, "Enable strong mode.")                                \
-  P(sync_async, bool, false, "Start `async` functions synchronously.")         \
+  P(sync_async, bool, true, "Start `async` functions synchronously.")          \
   R(support_ast_printer, false, bool, true, "Support the AST printer.")        \
   R(support_compiler_stats, false, bool, true, "Support compiler stats.")      \
   R(support_disassembler, false, bool, true, "Support the disassembler.")      \
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
index 905ba26..cd47729 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap.cc
@@ -33,11 +33,10 @@
 
 Heap::Heap(Isolate* isolate,
            intptr_t max_new_gen_semi_words,
-           intptr_t max_old_gen_words,
-           intptr_t max_external_words)
+           intptr_t max_old_gen_words)
     : isolate_(isolate),
       new_space_(this, max_new_gen_semi_words, kNewObjectAlignmentOffset),
-      old_space_(this, max_old_gen_words, max_external_words),
+      old_space_(this, max_old_gen_words),
       barrier_(new Monitor()),
       barrier_done_(new Monitor()),
       read_only_(false),
@@ -132,10 +131,10 @@
   if (space == kNew) {
     isolate()->AssertCurrentThreadIsMutator();
     new_space_.AllocateExternal(cid, size);
-    if (new_space_.ExternalInWords() > (FLAG_new_gen_ext_limit * MBInWords)) {
+    if (new_space_.ExternalInWords() > (4 * new_space_.CapacityInWords())) {
       // Attempt to free some external allocation by a scavenge. (If the total
       // remains above the limit, next external alloc will trigger another.)
-      CollectGarbage(kNew);
+      CollectGarbage(kScavenge, kExternal);
     }
   } else {
     ASSERT(space == kOld);
@@ -145,7 +144,7 @@
   // As a workaround, we check here on every external allocation. See issue
   // dartbug.com/33314.
   if (old_space_.NeedsGarbageCollection()) {
-    CollectAllGarbage();
+    CollectAllGarbage(kExternal);
   }
 }
 
@@ -368,10 +367,10 @@
   // a mark-sweep on time.
   if (old_space_.ShouldPerformIdleMarkCompact(deadline)) {
     TIMELINE_FUNCTION_GC_DURATION(thread, "IdleGC");
-    CollectOldSpaceGarbage(thread, kCompaction);
+    CollectOldSpaceGarbage(thread, kMarkCompact, kIdle);
   } else if (old_space_.ShouldPerformIdleMarkSweep(deadline)) {
     TIMELINE_FUNCTION_GC_DURATION(thread, "IdleGC");
-    CollectOldSpaceGarbage(thread, kIdle);
+    CollectOldSpaceGarbage(thread, kMarkSweep, kIdle);
   }
 }
 
@@ -380,50 +379,52 @@
 }
 
 void Heap::EvacuateNewSpace(Thread* thread, GCReason reason) {
-  ASSERT((reason == kFull) || (reason == kLowMemory));
+  ASSERT((reason != kOldSpace) && (reason != kPromotion));
   if (BeginNewSpaceGC(thread)) {
-    RecordBeforeGC(kNew, reason);
+    RecordBeforeGC(kScavenge, reason);
     VMTagScope tagScope(thread, VMTag::kGCNewSpaceTagId);
     TIMELINE_FUNCTION_GC_DURATION(thread, "EvacuateNewGeneration");
     new_space_.Evacuate();
-    RecordAfterGC(kNew);
+    RecordAfterGC(kScavenge);
     PrintStats();
     NOT_IN_PRODUCT(PrintStatsToTimeline(&tds, reason));
     EndNewSpaceGC();
   }
 }
 
-void Heap::CollectNewSpaceGarbage(Thread* thread,
-                                  GCReason reason) {
+void Heap::CollectNewSpaceGarbage(Thread* thread, GCReason reason) {
   ASSERT((reason != kOldSpace) && (reason != kPromotion));
   if (BeginNewSpaceGC(thread)) {
-    RecordBeforeGC(kNew, reason);
+    RecordBeforeGC(kScavenge, reason);
     {
       VMTagScope tagScope(thread, VMTag::kGCNewSpaceTagId);
       TIMELINE_FUNCTION_GC_DURATION_BASIC(thread, "CollectNewGeneration");
       new_space_.Scavenge();
-      RecordAfterGC(kNew);
+      RecordAfterGC(kScavenge);
       PrintStats();
       NOT_IN_PRODUCT(PrintStatsToTimeline(&tds, reason));
       EndNewSpaceGC();
     }
     if ((reason == kNewSpace) && old_space_.NeedsGarbageCollection()) {
-      CollectOldSpaceGarbage(thread, kPromotion);
+      CollectOldSpaceGarbage(thread, kMarkSweep, kPromotion);
     }
   }
 }
 
 void Heap::CollectOldSpaceGarbage(Thread* thread,
+                                  GCType type,
                                   GCReason reason) {
-  ASSERT((reason != kNewSpace));
+  ASSERT(reason != kNewSpace);
+  ASSERT(type != kScavenge);
+  if (FLAG_use_compactor) {
+    type = kMarkCompact;
+  }
   if (BeginOldSpaceGC(thread)) {
-    RecordBeforeGC(kOld, reason);
+    RecordBeforeGC(type, reason);
     VMTagScope tagScope(thread, VMTag::kGCOldSpaceTagId);
     TIMELINE_FUNCTION_GC_DURATION_BASIC(thread, "CollectOldGeneration");
-    bool compact =
-        (reason == kCompaction) || (reason == kLowMemory) || FLAG_use_compactor;
-    old_space_.CollectGarbage(compact);
-    RecordAfterGC(kOld);
+    old_space_.CollectGarbage(type == kMarkCompact);
+    RecordAfterGC(type);
     PrintStats();
     NOT_IN_PRODUCT(PrintStatsToTimeline(&tds, reason));
     // Some Code objects may have been collected so invalidate handler cache.
@@ -433,19 +434,16 @@
   }
 }
 
-void Heap::CollectGarbage(Space space,
-                          GCReason reason) {
+void Heap::CollectGarbage(GCType type, GCReason reason) {
   Thread* thread = Thread::Current();
-  switch (space) {
-    case kNew: {
+  switch (type) {
+    case kScavenge:
       CollectNewSpaceGarbage(thread, reason);
       break;
-    }
-    case kOld:
-    case kCode: {
-      CollectOldSpaceGarbage(thread, reason);
+    case kMarkSweep:
+    case kMarkCompact:
+      CollectOldSpaceGarbage(thread, type, reason);
       break;
-    }
     default:
       UNREACHABLE();
   }
@@ -454,7 +452,7 @@
 void Heap::CollectGarbage(Space space) {
   Thread* thread = Thread::Current();
   if (space == kOld) {
-    CollectOldSpaceGarbage(thread, kOldSpace);
+    CollectOldSpaceGarbage(thread, kMarkSweep, kOldSpace);
   } else {
     ASSERT(space == kNew);
     CollectNewSpaceGarbage(thread, kNewSpace);
@@ -467,7 +465,8 @@
   // New space is evacuated so this GC will collect all dead objects
   // kept alive by a cross-generational pointer.
   EvacuateNewSpace(thread, reason);
-  CollectOldSpaceGarbage(thread, reason);
+  CollectOldSpaceGarbage(
+      thread, reason == kLowMemory ? kMarkCompact : kMarkSweep, reason);
 }
 
 void Heap::WaitForSweeperTasks(Thread* thread) {
@@ -508,11 +507,9 @@
 
 void Heap::Init(Isolate* isolate,
                 intptr_t max_new_gen_words,
-                intptr_t max_old_gen_words,
-                intptr_t max_external_words) {
+                intptr_t max_old_gen_words) {
   ASSERT(isolate->heap() == NULL);
-  Heap* heap = new Heap(isolate, max_new_gen_words, max_old_gen_words,
-                        max_external_words);
+  Heap* heap = new Heap(isolate, max_new_gen_words, max_old_gen_words);
   isolate->set_heap(heap);
 }
 
@@ -629,6 +626,20 @@
   return old_space_.collections();
 }
 
+const char* Heap::GCTypeToString(GCType type) {
+  switch (type) {
+    case kScavenge:
+      return "Scavenge";
+    case kMarkSweep:
+      return "MarkSweep";
+    case kMarkCompact:
+      return "MarkCompact";
+    default:
+      UNREACHABLE();
+      return "";
+  }
+}
+
 const char* Heap::GCReasonToString(GCReason gc_reason) {
   switch (gc_reason) {
     case kNewSpace:
@@ -637,18 +648,16 @@
       return "promotion";
     case kOldSpace:
       return "old space";
-    case kCompaction:
-      return "compact";
     case kFull:
       return "full";
+    case kExternal:
+      return "external";
     case kIdle:
       return "idle";
     case kLowMemory:
       return "low memory";
-    case kGCAtAlloc:
+    case kDebugging:
       return "debugging";
-    case kGCTestCase:
-      return "test case";
     default:
       UNREACHABLE();
       return "";
@@ -727,11 +736,12 @@
 }
 #endif  // PRODUCT
 
-void Heap::RecordBeforeGC(Space space, GCReason reason) {
-  ASSERT((space == kNew && gc_new_space_in_progress_) ||
-         (space == kOld && gc_old_space_in_progress_));
+void Heap::RecordBeforeGC(GCType type, GCReason reason) {
+  ASSERT((type == kScavenge && gc_new_space_in_progress_) ||
+         (type == kMarkSweep && gc_old_space_in_progress_) ||
+         (type == kMarkCompact && gc_old_space_in_progress_));
   stats_.num_++;
-  stats_.space_ = space;
+  stats_.type_ = type;
   stats_.reason_ = reason;
   stats_.before_.micros_ = OS::GetCurrentMonotonicMicros();
   stats_.before_.new_ = new_space_.GetCurrentUsage();
@@ -742,10 +752,10 @@
     stats_.data_[i] = 0;
 }
 
-void Heap::RecordAfterGC(Space space) {
+void Heap::RecordAfterGC(GCType type) {
   stats_.after_.micros_ = OS::GetCurrentMonotonicMicros();
   int64_t delta = stats_.after_.micros_ - stats_.before_.micros_;
-  if (stats_.space_ == kNew) {
+  if (stats_.type_ == kScavenge) {
     new_space_.AddGCTime(delta);
     new_space_.IncrementCollections();
   } else {
@@ -754,8 +764,9 @@
   }
   stats_.after_.new_ = new_space_.GetCurrentUsage();
   stats_.after_.old_ = old_space_.GetCurrentUsage();
-  ASSERT((space == kNew && gc_new_space_in_progress_) ||
-         (space == kOld && gc_old_space_in_progress_));
+  ASSERT((type == kScavenge && gc_new_space_in_progress_) ||
+         (type == kMarkSweep && gc_old_space_in_progress_) ||
+         (type == kMarkCompact && gc_old_space_in_progress_));
 #ifndef PRODUCT
   if (FLAG_support_service && Service::gc_stream.enabled() &&
       !ServiceIsolate::IsServiceIsolateDescendant(Isolate::Current())) {
@@ -788,9 +799,8 @@
   }
 
   // clang-format off
-  const char* space_str = stats_.space_ == kNew ? "Scavenge" : "Mark-Sweep";
   OS::PrintErr(
-    "[ %-13.13s, %10s(%9s), "  // GC(isolate), space(reason)
+    "[ %-13.13s, %10s(%9s), "  // GC(isolate), type(reason)
     "%4" Pd ", "  // count
     "%6.2f, "  // start time
     "%5.1f, "  // total time
@@ -803,11 +813,13 @@
     "%6.2f, %6.2f, %6.2f, %6.2f, %6.2f, %6.2f, "  // times
     "%" Pd ", %" Pd ", %" Pd ", %" Pd ", "  // data
     "]\n",  // End with a comma to make it easier to import in spreadsheets.
-    isolate()->name(), space_str, GCReasonToString(stats_.reason_),
+    isolate()->name(),
+    GCTypeToString(stats_.type_),
+    GCReasonToString(stats_.reason_),
     stats_.num_,
     MicrosecondsToSeconds(isolate()->UptimeMicros()),
     MicrosecondsToMilliseconds(stats_.after_.micros_ -
-                                    stats_.before_.micros_),
+                               stats_.before_.micros_),
     RoundWordsToKB(stats_.before_.new_.used_in_words),
     RoundWordsToKB(stats_.after_.new_.used_in_words),
     RoundWordsToKB(stats_.before_.new_.capacity_in_words),
diff --git a/runtime/vm/heap.h b/runtime/vm/heap.h
index 9678e61..2edf4cf 100644
--- a/runtime/vm/heap.h
+++ b/runtime/vm/heap.h
@@ -41,16 +41,21 @@
     kNumWeakSelectors
   };
 
+  enum GCType {
+    kScavenge,
+    kMarkSweep,
+    kMarkCompact,
+  };
+
   enum GCReason {
-    kNewSpace,
-    kPromotion,
-    kOldSpace,
-    kCompaction,
-    kFull,
-    kIdle,
-    kLowMemory,
-    kGCAtAlloc,
-    kGCTestCase,
+    kNewSpace,   // New space is full.
+    kPromotion,  // Old space limit crossed after a scavenge.
+    kOldSpace,   // Old space limit crossed.
+    kFull,       // Heap::CollectAllGarbage
+    kExternal,   // Dart_NewWeakPersistentHandle
+    kIdle,       // Dart_NotifyIdle
+    kLowMemory,  // Dart_NotifyLowMemory
+    kDebugging,  // service request, --gc_at_instance_allocation, etc.
   };
 
   // Pattern for unused new space and swept old space.
@@ -110,7 +115,7 @@
   void NotifyLowMemory();
 
   void CollectGarbage(Space space);
-  void CollectGarbage(Space space, GCReason reason);
+  void CollectGarbage(GCType type, GCReason reason);
   void CollectAllGarbage(GCReason reason = kFull);
   bool NeedsGarbageCollection() const {
     return old_space_.NeedsGarbageCollection();
@@ -136,8 +141,7 @@
   // Initialize the heap and register it with the isolate.
   static void Init(Isolate* isolate,
                    intptr_t max_new_gen_words,
-                   intptr_t max_old_gen_words,
-                   intptr_t max_external_words);
+                   intptr_t max_old_gen_words);
 
   // Writes a suitable name for a VM region in the heap into the buffer `name`.
   static void RegionName(Heap* heap,
@@ -163,7 +167,8 @@
   ObjectSet* CreateAllocatedObjectSet(Zone* zone,
                                       MarkExpectation mark_expectation) const;
 
-  static const char* GCReasonToString(GCReason gc_reason);
+  static const char* GCTypeToString(GCType type);
+  static const char* GCReasonToString(GCReason reason);
 
   // Associate a peer with an object.  A non-existent peer is equal to NULL.
   void SetPeer(RawObject* raw_obj, void* peer) {
@@ -264,7 +269,7 @@
    public:
     GCStats() {}
     intptr_t num_;
-    Heap::Space space_;
+    Heap::GCType type_;
     Heap::GCReason reason_;
 
     class Data : public ValueObject {
@@ -292,8 +297,7 @@
 
   Heap(Isolate* isolate,
        intptr_t max_new_gen_semi_words,  // Max capacity of new semi-space.
-       intptr_t max_old_gen_words,
-       intptr_t max_external_words);
+       intptr_t max_old_gen_words);
 
   uword AllocateNew(intptr_t size);
   uword AllocateOld(intptr_t size, HeapPage::PageType type);
@@ -315,13 +319,12 @@
   // Helper functions for garbage collection.
   void CollectNewSpaceGarbage(Thread* thread,
                               GCReason reason);
-  void CollectOldSpaceGarbage(Thread* thread,
-                              GCReason reason);
+  void CollectOldSpaceGarbage(Thread* thread, GCType type, GCReason reason);
   void EvacuateNewSpace(Thread* thread, GCReason reason);
 
   // GC stats collection.
-  void RecordBeforeGC(Space space, GCReason reason);
-  void RecordAfterGC(Space space);
+  void RecordBeforeGC(GCType type, GCReason reason);
+  void RecordAfterGC(GCType type);
   void PrintStats();
   void PrintStatsToTimeline(TimelineEventScope* event, GCReason reason);
 
diff --git a/runtime/vm/interpreter.cc b/runtime/vm/interpreter.cc
index dba91ad..fdbc665 100644
--- a/runtime/vm/interpreter.cc
+++ b/runtime/vm/interpreter.cc
@@ -144,10 +144,6 @@
           case kMintCid:
             return (static_cast<RawMint*>(lhs)->ptr()->value_ ==
                     static_cast<RawMint*>(rhs)->ptr()->value_);
-
-          case kBigintCid:
-            return (DLRT_BigintCompare(static_cast<RawBigint*>(lhs),
-                                       static_cast<RawBigint*>(rhs)) == 0);
         }
       }
     }
@@ -627,6 +623,7 @@
   thread->set_top_exit_frame_info(reinterpret_cast<uword>(fp_));
 #if defined(DEBUG)
   if (IsTracingExecution()) {
+    THR_Print("%" Pu64 " ", icount_);
     THR_Print("Exiting interpreter 0x%" Px " at fp_ 0x%" Px "\n",
               reinterpret_cast<uword>(this), reinterpret_cast<uword>(fp_));
   }
@@ -870,16 +867,18 @@
     if (Function::HasCode(function)) {
       RawCode* code = function->ptr()->code_;
       ASSERT(code != StubCode::LazyCompile_entry()->code());
-      // TODO(regis): Do we really need a stub? Try to invoke directly.
+      // TODO(regis): Once we share the same stack, try to invoke directly.
 
       // On success, returns a RawInstance.  On failure, a RawError.
       typedef RawObject* (*invokestub)(RawCode * code, RawArray * argdesc,
                                        RawObject * *arg0, Thread * thread);
       invokestub entrypoint = reinterpret_cast<invokestub>(
           StubCode::InvokeDartCodeFromBytecode_entry()->EntryPoint());
-      *call_base = entrypoint(code, argdesc, call_base, thread);
-      // Result is at call_base;
+      RawObject* result = entrypoint(code, argdesc, call_base, thread);
+
+      // Pop args and push result.
       *SP = call_base;
+      **SP = result;
     } else {
       ASSERT(Function::HasBytecode(function));
       // Bytecode was loaded in the above compilation step.
@@ -916,6 +915,12 @@
   RawObject** callee_fp = call_top + kKBCDartFrameFixedSize;
 
   RawFunction* function = FrameFunction(callee_fp);
+#if defined(DEBUG)
+  if (IsTracingExecution()) {
+    THR_Print("%" Pu64 " ", icount_);
+    THR_Print("invoking %s\n", Function::Handle(function).ToCString());
+  }
+#endif
   if (Function::HasCode(function) || !Function::HasBytecode(function)) {
     // TODO(regis): If the function is a dispatcher, execute the dispatch here.
     if (!InvokeCompiled(thread, function, argdesc_, call_base, call_top, pc, FP,
@@ -1254,16 +1259,18 @@
     FP = reinterpret_cast<RawObject**>(fp_);                                   \
     pc = reinterpret_cast<uint32_t*>(pc_);                                     \
     if ((reinterpret_cast<uword>(pc) & 2) != 0) { /* Entry frame? */           \
-      fp_ = reinterpret_cast<RawObject**>(fp_[0]);                             \
-      thread->set_top_exit_frame_info(reinterpret_cast<uword>(fp_));           \
+      uword exit_fp = reinterpret_cast<uword>(fp_[0]);                         \
+      thread->set_top_exit_frame_info(exit_fp);                                \
       thread->set_top_resource(top_resource);                                  \
       thread->set_vm_tag(vm_tag);                                              \
       if (IsTracingExecution()) {                                              \
+        THR_Print("%" Pu64 " ", icount_);                                      \
         THR_Print("Returning exception from interpreter 0x%" Px                \
                   " at fp_ 0x%" Px "\n",                                       \
                   reinterpret_cast<uword>(this),                               \
                   reinterpret_cast<uword>(fp_));                               \
       }                                                                        \
+      ASSERT(reinterpret_cast<uword>(fp_) < stack_limit());                    \
       return special_[kExceptionSpecialIndex];                                 \
     }                                                                          \
     pp_ = InterpreterHelpers::FrameCode(FP)->ptr()->object_pool_;              \
@@ -1277,8 +1284,8 @@
     FP = reinterpret_cast<RawObject**>(fp_);                                   \
     pc = reinterpret_cast<uint32_t*>(pc_);                                     \
     if ((reinterpret_cast<uword>(pc) & 2) != 0) { /* Entry frame? */           \
-      fp_ = reinterpret_cast<RawObject**>(fp_[0]);                             \
-      thread->set_top_exit_frame_info(reinterpret_cast<uword>(fp_));           \
+      uword exit_fp = reinterpret_cast<uword>(fp_[0]);                         \
+      thread->set_top_exit_frame_info(exit_fp);                                \
       thread->set_top_resource(top_resource);                                  \
       thread->set_vm_tag(vm_tag);                                              \
       return special_[kExceptionSpecialIndex];                                 \
@@ -1388,13 +1395,15 @@
 
   bool reentering = fp_ != NULL;
   if (!reentering) {
-    fp_ = reinterpret_cast<RawObject**>(stack_);
+    fp_ = reinterpret_cast<RawObject**>(stack_base_);
   }
 #if defined(DEBUG)
   if (IsTracingExecution()) {
-    THR_Print("%s interpreter 0x%" Px " at fp_ 0x%" Px "\n",
+    THR_Print("%" Pu64 " ", icount_);
+    THR_Print("%s interpreter 0x%" Px " at fp_ 0x%" Px " %s\n",
               reentering ? "Re-entering" : "Entering",
-              reinterpret_cast<uword>(this), reinterpret_cast<uword>(fp_));
+              reinterpret_cast<uword>(this), reinterpret_cast<uword>(fp_),
+              Function::Handle(code.function()).ToCString());
   }
 #endif
 
@@ -1420,7 +1429,7 @@
   //       | arg 1       | -+
   //       | function    | -+
   //       | code        |  |
-  //       | callee PC   | ---> special fake PC marking an entry frame
+  //       | caller PC   | ---> special fake PC marking an entry frame
   //  SP > | fp_         |  |
   //  FP > | ........... |   > normal Dart frame (see stack_frame_kbc.h)
   //                        |
@@ -1705,14 +1714,12 @@
   {
     BYTECODE(CheckStack, A);
     {
-      // TODO(regis): Support a second stack limit or can we share the DBC one?
-#if 0
-      if (reinterpret_cast<uword>(SP) >= thread->stack_limit()) {
+      // Using the interpreter stack limit and not the thread stack limit.
+      if (reinterpret_cast<uword>(SP) >= stack_limit()) {
         Exit(thread, FP, SP + 1, pc);
         NativeArguments args(thread, 0, NULL, NULL);
         INVOKE_RUNTIME(DRT_StackOverflow, args);
       }
-#endif
     }
     DISPATCH();
   }
@@ -2908,16 +2915,22 @@
 
     // Check if it is a fake PC marking the entry frame.
     if ((reinterpret_cast<uword>(pc) & 2) != 0) {
-      const intptr_t argc = reinterpret_cast<uword>(pc) >> 2;
-      fp_ = reinterpret_cast<RawObject**>(FrameArguments(FP, argc + 1)[0]);
-      thread->set_top_exit_frame_info(reinterpret_cast<uword>(fp_));
+      // Pop entry frame.
+      fp_ = SavedCallerFP(FP);
+      // Restore exit frame info saved in entry frame.
+      uword exit_fp = reinterpret_cast<uword>(fp_[0]);
+      thread->set_top_exit_frame_info(exit_fp);
       thread->set_top_resource(top_resource);
       thread->set_vm_tag(vm_tag);
 #if defined(DEBUG)
       if (IsTracingExecution()) {
+        THR_Print("%" Pu64 " ", icount_);
         THR_Print("Returning from interpreter 0x%" Px " at fp_ 0x%" Px "\n",
                   reinterpret_cast<uword>(this), reinterpret_cast<uword>(fp_));
       }
+      ASSERT(reinterpret_cast<uword>(fp_) < stack_limit());
+      const intptr_t argc = reinterpret_cast<uword>(pc) >> 2;
+      ASSERT(fp_ == FrameArguments(FP, argc + 1));
 #endif
       return result;
     }
diff --git a/runtime/vm/interpreter.h b/runtime/vm/interpreter.h
index def46e6..517cbaa 100644
--- a/runtime/vm/interpreter.h
+++ b/runtime/vm/interpreter.h
@@ -5,6 +5,9 @@
 #ifndef RUNTIME_VM_INTERPRETER_H_
 #define RUNTIME_VM_INTERPRETER_H_
 
+#include "vm/globals.h"
+#if defined(DART_USE_INTERPRETER)
+
 #include "vm/compiler/method_recognizer.h"
 #include "vm/constants_kbc.h"
 
@@ -54,6 +57,14 @@
   uword top_exit_frame_info() const { return top_exit_frame_info_; }
   void set_top_exit_frame_info(uword value) { top_exit_frame_info_ = value; }
 
+  // Returns true if the interpreter's stack contains the given frame.
+  // TODO(regis): Once the interpreter shares the native stack, we may rely on
+  // a new thread vm_tag to identify an interpreter frame and we will not need
+  // this HasFrame() method.
+  bool HasFrame(uword frame) const {
+    return frame >= stack_base() && frame <= get_fp();
+  }
+
   // Call on program start.
   static void InitOnce();
 
@@ -196,4 +207,6 @@
 
 }  // namespace dart
 
+#endif  // defined(DART_USE_INTERPRETER)
+
 #endif  // RUNTIME_VM_INTERPRETER_H_
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index c00b259..5337d5a 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -1066,8 +1066,7 @@
                  : FLAG_new_gen_semi_max_size * MBInWords,
              (is_service_or_kernel_isolate ? kDefaultMaxOldGenHeapSize
                                            : FLAG_old_gen_heap_size) *
-                 MBInWords,
-             FLAG_external_max_size * MBInWords);
+                 MBInWords);
 
   // TODO(5411455): For now just set the recently created isolate as
   // the current isolate.
diff --git a/runtime/vm/json_stream.h b/runtime/vm/json_stream.h
index 3fa5e36..42848bb 100644
--- a/runtime/vm/json_stream.h
+++ b/runtime/vm/json_stream.h
@@ -58,6 +58,9 @@
   kIsolateIsReloading = 108,
   kIsolateReloadBarred = 109,
   kIsolateMustHaveReloaded = 110,
+  kServiceAlreadyRegistered = 111,
+  kServiceDisappeared = 112,
+  kExpressionCompilationError = 113,
 
   // Experimental (used in private rpcs).
   kFileSystemAlreadyExists = 1001,
diff --git a/runtime/vm/kernel.cc b/runtime/vm/kernel.cc
index 5394e53..7b7ac73 100644
--- a/runtime/vm/kernel.cc
+++ b/runtime/vm/kernel.cc
@@ -22,7 +22,8 @@
   StreamingFlowGraphBuilder builder(&translation_helper,
                                     Script::Handle(zone, field.Script()), zone,
                                     TypedData::Handle(zone, field.KernelData()),
-                                    field.KernelDataProgramOffset());
+                                    field.KernelDataProgramOffset(),
+                                    /* active_class = */ NULL);
   builder.SetOffset(field.kernel_offset());
   kernel::FieldHelper field_helper(&builder);
   field_helper.ReadUntilExcluding(kernel::FieldHelper::kEnd, true);
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index bdba931..f0b47d5 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -88,7 +88,7 @@
     api_flags.enable_error_on_bad_override = false;
     api_flags.reify_generic_functions = false;
     api_flags.strong = false;
-    api_flags.sync_async = false;
+    api_flags.sync_async = true;
 #if !defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_DBC)
     api_flags.use_field_guards = true;
 #endif
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index e473239..5b5dfc4 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -175,7 +175,8 @@
                zone_,
                program_->kernel_data(),
                program_->kernel_data_size(),
-               0),
+               0,
+               &active_class_),
       external_name_class_(Class::Handle(Z)),
       external_name_field_(Field::Handle(Z)),
       potential_natives_(GrowableObjectArray::Handle(Z)),
@@ -185,7 +186,7 @@
         "Trying to load a concatenated dill file at a time where that is "
         "not allowed");
   }
-  T.active_class_ = &active_class_;
+  ASSERT(T.active_class_ == &active_class_);
   T.finalize_ = false;
 
   initialize_fields();
@@ -340,12 +341,17 @@
       kernel_program_info_(
           KernelProgramInfo::ZoneHandle(zone_, script.kernel_program_info())),
       translation_helper_(this, thread_),
-      builder_(&translation_helper_, script, zone_, kernel_data, 0),
+      builder_(&translation_helper_,
+               script,
+               zone_,
+               kernel_data,
+               0,
+               &active_class_),
       external_name_class_(Class::Handle(Z)),
       external_name_field_(Field::Handle(Z)),
       potential_natives_(GrowableObjectArray::Handle(Z)),
       potential_extension_libraries_(GrowableObjectArray::Handle(Z)) {
-  T.active_class_ = &active_class_;
+  ASSERT(T.active_class_ == &active_class_);
   T.finalize_ = false;
 
   const Array& scripts = Array::Handle(Z, kernel_program_info_.scripts());
@@ -369,7 +375,7 @@
 
   builder_.SetOffset(program_->constant_table_offset());
   StreamingDartTypeTranslator type_translator_(&builder_, true /* finalize */);
-  type_translator_.active_class_ = &active_class_;
+  ASSERT(type_translator_.active_class_ == &active_class_);
 
   ConstantHelper helper(&active_class_, &builder_, &type_translator_,
                         &translation_helper_, Z, skip_vmservice_library_);
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index ed6ecb1..beb89ec 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -740,8 +740,6 @@
   isolate->object_store()->set_two_byte_string_class(cls);
   cls = Class::New<Mint>();
   isolate->object_store()->set_mint_class(cls);
-  cls = Class::New<Bigint>();
-  isolate->object_store()->set_bigint_class(cls);
   cls = Class::New<Double>();
   isolate->object_store()->set_double_class(cls);
 
@@ -1036,8 +1034,8 @@
         // Some classes have identity hash codes that depend on their contents,
         // not per object.
         ASSERT(!obj->IsStringInstance());
-        if (!obj->IsMint() && !obj->IsDouble() && !obj->IsBigint() &&
-            !obj->IsRawNull() && !obj->IsBool()) {
+        if (!obj->IsMint() && !obj->IsDouble() && !obj->IsRawNull() &&
+            !obj->IsBool()) {
           counter_ += 2011;  // The year Dart was announced and a prime.
           counter_ &= 0x3fffffff;
           if (counter_ == 0) counter_++;
@@ -1550,11 +1548,6 @@
     RegisterPrivateClass(cls, Symbols::_Mint(), core_lib);
     pending_classes.Add(cls);
 
-    cls = Class::New<Bigint>();
-    object_store->set_bigint_class(cls);
-    RegisterPrivateClass(cls, Symbols::_Bigint(), core_lib);
-    pending_classes.Add(cls);
-
     cls = Class::New<Double>();
     object_store->set_double_class(cls);
     RegisterPrivateClass(cls, Symbols::_Double(), core_lib);
@@ -1918,9 +1911,6 @@
     cls = Class::New<Closure>();
     object_store->set_closure_class(cls);
 
-    cls = Class::New<Bigint>();
-    object_store->set_bigint_class(cls);
-
     cls = Class::NewStringClass(kOneByteStringCid);
     object_store->set_one_byte_string_class(cls);
 
@@ -3253,25 +3243,48 @@
                            const Array& type_param_names,
                            const TypeArguments& type_param_values) const {
   ASSERT(Thread::Current()->IsMutatorThread());
-  if (id() < kInstanceCid) {
-    const Instance& exception = Instance::Handle(
-        String::New("Cannot evaluate against a VM internal class"));
+  if (id() < kInstanceCid || id() == kTypeArgumentsCid) {
+    const Instance& exception = Instance::Handle(String::New(
+        "Expressions can be evaluated only with regular Dart instances"));
     const Instance& stacktrace = Instance::Handle();
     return UnhandledException::New(exception, stacktrace);
   }
 
-  if (Library::Handle(library()).kernel_data() == TypedData::null() ||
-      !FLAG_enable_kernel_expression_compilation) {
-    const Function& eval_func = Function::Handle(
-        Function::EvaluateHelper(*this, expr, param_names, true));
-    return DartEntry::InvokeFunction(eval_func, param_values);
+  ASSERT(Library::Handle(library()).kernel_data() == TypedData::null() ||
+         !FLAG_enable_kernel_expression_compilation);
+  const Function& eval_func = Function::Handle(
+      Function::EvaluateHelper(*this, expr, param_names, true));
+  return DartEntry::InvokeFunction(eval_func, param_values);
+}
+
+static RawObject* EvaluateCompiledExpressionHelper(
+    const uint8_t* kernel_bytes,
+    intptr_t kernel_length,
+    const Array& type_definitions,
+    const String& library_url,
+    const String& klass,
+    const Array& arguments,
+    const TypeArguments& type_arguments);
+
+RawObject* Class::EvaluateCompiledExpression(
+    const uint8_t* kernel_bytes,
+    intptr_t kernel_length,
+    const Array& type_definitions,
+    const Array& arguments,
+    const TypeArguments& type_arguments) const {
+  ASSERT(Thread::Current()->IsMutatorThread());
+  if (id() < kInstanceCid || id() == kTypeArgumentsCid) {
+    const Instance& exception = Instance::Handle(String::New(
+        "Expressions can be evaluated only with regular Dart instances"));
+    const Instance& stacktrace = Instance::Handle();
+    return UnhandledException::New(exception, stacktrace);
   }
 
-  return EvaluateWithDFEHelper(
-      expr, param_names, type_param_names,
+  return EvaluateCompiledExpressionHelper(
+      kernel_bytes, kernel_length, type_definitions,
       String::Handle(Library::Handle(library()).url()),
       IsTopLevel() ? String::Handle() : String::Handle(UserVisibleName()),
-      !IsTopLevel(), param_values, type_param_values);
+      arguments, type_arguments);
 }
 
 // Ensure that top level parsing of the class has been done.
@@ -3637,7 +3650,6 @@
     case kIntegerCid:
     case kSmiCid:
     case kMintCid:
-    case kBigintCid:
       return Symbols::Int().raw();
     case kDoubleCid:
       return Symbols::Double().raw();
@@ -3696,7 +3708,7 @@
     kernel::TranslationHelper helper(thread);
     helper.InitFromScript(scr);
     kernel::StreamingFlowGraphBuilder builder_(&helper, scr, zone, kernel_data,
-                                               0);
+                                               0, /* active_class = */ NULL);
     builder_.SetOffset(class_offset);
     kernel::ClassHelper class_helper(&builder_);
     class_helper.ReadUntilIncluding(kernel::ClassHelper::kEndPosition);
@@ -4161,7 +4173,7 @@
         return true;
       }
     }
-    if (other_type_arg.IsType() &&
+    if (other_type_arg.HasResolvedTypeClass() &&
         TypeTest(Class::kIsSubtypeOf, type_arguments,
                  Class::Handle(zone, other_type_arg.type_class()),
                  TypeArguments::Handle(other_type_arg.arguments()), bound_error,
@@ -4641,29 +4653,6 @@
   return canonical_value.raw();
 }
 
-RawBigint* Class::LookupCanonicalBigint(Zone* zone,
-                                        const Bigint& value,
-                                        intptr_t* index) const {
-  ASSERT(this->raw() == Isolate::Current()->object_store()->bigint_class());
-  const Array& constants = Array::Handle(zone, this->constants());
-  const intptr_t constants_len = constants.Length();
-  // Linear search to see whether this value is already present in the
-  // list of canonicalized constants.
-  Bigint& canonical_value = Bigint::Handle(zone);
-  while (*index < constants_len) {
-    canonical_value ^= constants.At(*index);
-    if (canonical_value.IsNull()) {
-      break;
-    }
-    if (canonical_value.Equals(value)) {
-      ASSERT(canonical_value.IsCanonical());
-      return canonical_value.raw();
-    }
-    *index = *index + 1;
-  }
-  return Bigint::null();
-}
-
 class CanonicalInstanceKey {
  public:
   explicit CanonicalInstanceKey(const Instance& key) : key_(key) {
@@ -4762,23 +4751,9 @@
   this->set_constants(constants.Release());
 }
 
-void Class::InsertCanonicalBigint(Zone* zone,
-                                  intptr_t index,
-                                  const Bigint& constant) const {
-  // The constant needs to be added to the list. Grow the list if it is full.
-  Array& canonical_list = Array::Handle(zone, constants());
-  const intptr_t list_len = canonical_list.Length();
-  if (index >= list_len) {
-    const intptr_t new_length = list_len + 4 + (list_len >> 2);
-    canonical_list ^= Array::Grow(canonical_list, new_length, Heap::kOld);
-    set_constants(canonical_list);
-  }
-  canonical_list.SetAt(index, constant);
-}
-
 void Class::RehashConstants(Zone* zone) const {
   intptr_t cid = id();
-  if ((cid == kMintCid) || (cid == kBigintCid) || (cid == kDoubleCid)) {
+  if ((cid == kMintCid) || (cid == kDoubleCid)) {
     // Constants stored as a plain list or in a hashset with a stable hashcode,
     // which only depends on the actual value of the constant.
     return;
@@ -5650,7 +5625,7 @@
   // We should not have loaded the bytecode if the function had code.
   ASSERT(!HasCode());
 
-  // Set the code entry_point to to InterpretCall stub.
+  // Set the code entry_point to InterpretCall stub.
   SetInstructions(Code::Handle(StubCode::InterpretCall_entry()->code()));
 }
 
@@ -7331,7 +7306,8 @@
     kernel::TranslationHelper translation_helper(thread);
     kernel::StreamingFlowGraphBuilder builder(
         &translation_helper, function_script, zone,
-        TypedData::Handle(zone, KernelData()), KernelDataProgramOffset());
+        TypedData::Handle(zone, KernelData()), KernelDataProgramOffset(),
+        /* active_class = */ NULL);
     translation_helper.InitFromScript(function_script);
     builder.SetOffset(kernel_offset());
 
@@ -9191,7 +9167,6 @@
       if (lit.IsNull()) {
         // Convert token to an error.
         ASSERT(descriptor.kind == Token::kINTEGER);
-        ASSERT(FLAG_limit_ints_to_64_bits);
         Scanner::TokenDescriptor errorDesc = descriptor;
         errorDesc.kind = Token::kERROR;
         errorDesc.literal = &String::Handle(Symbols::NewFormatted(
@@ -11441,6 +11416,17 @@
                                param_values, type_param_values);
 }
 
+RawObject* Library::EvaluateCompiledExpression(
+    const uint8_t* kernel_bytes,
+    intptr_t kernel_length,
+    const Array& type_definitions,
+    const Array& arguments,
+    const TypeArguments& type_arguments) const {
+  return EvaluateCompiledExpressionHelper(
+      kernel_bytes, kernel_length, type_definitions, String::Handle(url()),
+      String::Handle(), arguments, type_arguments);
+}
+
 void Library::InitNativeWrappersLibrary(Isolate* isolate, bool is_kernel) {
   static const int kNumNativeWrappersClasses = 4;
   COMPILE_ASSERT((kNumNativeWrappersClasses > 0) &&
@@ -11520,10 +11506,12 @@
         is_static);
   }
 
+  GrowableObjectArray& libraries =
+      GrowableObjectArray::Handle(T->zone(), I->object_store()->libraries());
+
   Function& callee = Function::Handle();
   intptr_t num_cids = I->class_table()->NumCids();
-  intptr_t num_libs =
-      GrowableObjectArray::Handle(I->object_store()->libraries()).Length();
+  intptr_t num_libs = libraries.Length();
 
   if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
     const String& prefix =
@@ -11554,12 +11542,9 @@
   const Object& result = Object::Handle(loader.LoadProgram());
   if (result.IsError()) return result.raw();
   ASSERT(I->class_table()->NumCids() > num_cids &&
-         GrowableObjectArray::Handle(I->object_store()->libraries()).Length() ==
-             num_libs + 1);
-  const String& fake_library_url =
-      String::Handle(String::New("evaluate:source"));
+         libraries.Length() == num_libs + 1);
   const Library& loaded =
-      Library::Handle(Library::LookupLibrary(T, fake_library_url));
+      Library::Handle(Library::LookupLibrary(T, Symbols::EvalSourceUri()));
   ASSERT(!loaded.IsNull());
 
   String& debug_name = String::Handle(
@@ -11597,14 +11582,13 @@
   callee.set_owner(real_class);
 
   // Unlink the fake library and class from the object store.
-  GrowableObjectArray::Handle(I->object_store()->libraries())
-      .SetLength(num_libs);
+  libraries.SetLength(num_libs);
   I->class_table()->SetNumCids(num_cids);
   if (!fake_class.IsNull()) {
     fake_class.set_id(kIllegalCid);
   }
   LibraryLookupMap libraries_map(I->object_store()->libraries_map());
-  bool removed = libraries_map.Remove(fake_library_url);
+  bool removed = libraries_map.Remove(Symbols::EvalSourceUri());
   ASSERT(removed);
   I->object_store()->set_libraries_map(libraries_map.Release());
 
@@ -11626,6 +11610,113 @@
 #endif
 }
 
+static RawObject* EvaluateCompiledExpressionHelper(
+    const uint8_t* kernel_bytes,
+    intptr_t kernel_length,
+    const Array& type_definitions,
+    const String& library_url,
+    const String& klass,
+    const Array& arguments,
+    const TypeArguments& type_arguments) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+  const String& error_str = String::Handle(
+      String::New("Expression evaluation not available in precompiled mode."));
+  return ApiError::New(error_str);
+#else
+  Isolate* I = Isolate::Current();
+  Thread* T = Thread::Current();
+
+  kernel::Program* kernel_pgm =
+      kernel::Program::ReadFromBuffer(kernel_bytes, kernel_length, true);
+
+  if (kernel_pgm == NULL) {
+    return ApiError::New(String::Handle(
+        String::New("Kernel isolate returned ill-formed kernel.")));
+  }
+
+  kernel_pgm->set_release_buffer_callback(ReleaseFetchedBytes);
+
+  Function& callee = Function::Handle();
+  intptr_t num_cids = I->class_table()->NumCids();
+  GrowableObjectArray& libraries =
+      GrowableObjectArray::Handle(T->zone(), I->object_store()->libraries());
+  intptr_t num_libs = libraries.Length();
+
+  // Load the program with the debug procedure as a regular, independent
+  // program.
+  kernel::KernelLoader loader(kernel_pgm);
+  const Object& result = Object::Handle(loader.LoadProgram());
+  if (result.IsError()) return result.raw();
+  ASSERT(I->class_table()->NumCids() > num_cids &&
+         libraries.Length() == num_libs + 1);
+  const Library& loaded =
+      Library::Handle(Library::LookupLibrary(T, Symbols::EvalSourceUri()));
+  ASSERT(!loaded.IsNull());
+
+  String& debug_name = String::Handle(
+      String::New(Symbols::Symbol(Symbols::kDebugProcedureNameId)));
+  Class& fake_class = Class::Handle();
+  if (!klass.IsNull()) {
+    fake_class = loaded.LookupClass(Symbols::DebugClassName());
+    ASSERT(!fake_class.IsNull());
+    callee = fake_class.LookupFunctionAllowPrivate(debug_name);
+  } else {
+    callee = loaded.LookupFunctionAllowPrivate(debug_name);
+  }
+  ASSERT(!callee.IsNull());
+
+  // Save the loaded library's kernel data to the generic "data" field of the
+  // callee, so it doesn't require access it's parent library during
+  // compilation.
+  callee.SetKernelDataAndScript(Script::Handle(callee.script()),
+                                TypedData::Handle(loaded.kernel_data()),
+                                loaded.kernel_offset());
+
+  // Reparent the callee to the real enclosing class so we can remove the fake
+  // class and library from the object store.
+  const Library& real_library =
+      Library::Handle(Library::LookupLibrary(T, library_url));
+  ASSERT(!real_library.IsNull());
+  Class& real_class = Class::Handle();
+  if (!klass.IsNull()) {
+    real_class = real_library.LookupClassAllowPrivate(klass);
+  } else {
+    real_class = real_library.toplevel_class();
+  }
+  ASSERT(!real_class.IsNull());
+
+  callee.set_owner(real_class);
+
+  // Unlink the fake library and class from the object store.
+  libraries.SetLength(num_libs);
+  I->class_table()->SetNumCids(num_cids);
+  if (!fake_class.IsNull()) {
+    fake_class.set_id(kIllegalCid);
+  }
+  LibraryLookupMap libraries_map(I->object_store()->libraries_map());
+  bool removed = libraries_map.Remove(Symbols::EvalSourceUri());
+  ASSERT(removed);
+  I->object_store()->set_libraries_map(libraries_map.Release());
+
+  if (type_definitions.Length() == 0) {
+    return DartEntry::InvokeFunction(callee, arguments);
+  }
+
+  intptr_t num_type_args = type_arguments.Length();
+  Array& real_arguments = Array::Handle(Array::New(arguments.Length() + 1));
+  real_arguments.SetAt(0, type_arguments);
+  Object& arg = Object::Handle();
+  for (intptr_t i = 0; i < arguments.Length(); ++i) {
+    arg = arguments.At(i);
+    real_arguments.SetAt(i + 1, arg);
+  }
+
+  const Array& args_desc = Array::Handle(
+      ArgumentsDescriptor::New(num_type_args, arguments.Length()));
+  return DartEntry::InvokeFunction(callee, real_arguments, args_desc);
+#endif
+}
+
 // Returns library with given url in current isolate, or NULL.
 RawLibrary* Library::LookupLibrary(Thread* thread, const String& url) {
   Zone* zone = thread->zone();
@@ -14881,6 +14972,8 @@
   code.SetPrologueOffset(bytecode_size);  // TODO(regis): Correct?
   INC_STAT(Thread::Current(), total_code_size,
            code.comments().comments_.Length());
+  // TODO(regis): Until we support exception handling.
+  code.set_exception_handlers(Object::empty_exception_handlers());
   return code.raw();
 }
 #endif  // defined(DART_USE_INTERPRETER)
@@ -15861,17 +15954,34 @@
   }
 
   const Library& library = Library::Handle(method_cls.library());
-  if (library.kernel_data() == TypedData::null() ||
-      !FLAG_enable_kernel_expression_compilation) {
-    const Function& eval_func = Function::Handle(
-        Function::EvaluateHelper(method_cls, expr, param_names, false));
-    return DartEntry::InvokeFunction(eval_func, args);
+  ASSERT(library.kernel_data() == TypedData::null() ||
+         !FLAG_enable_kernel_expression_compilation);
+  const Function& eval_func = Function::Handle(
+      Function::EvaluateHelper(method_cls, expr, param_names, false));
+  return DartEntry::InvokeFunction(eval_func, args);
+}
+
+RawObject* Instance::EvaluateCompiledExpression(
+    const Class& method_cls,
+    const uint8_t* kernel_bytes,
+    intptr_t kernel_length,
+    const Array& type_definitions,
+    const Array& arguments,
+    const TypeArguments& type_arguments) const {
+  const Array& arguments_with_receiver =
+      Array::Handle(Array::New(1 + arguments.Length()));
+  PassiveObject& param = PassiveObject::Handle();
+  arguments_with_receiver.SetAt(0, *this);
+  for (intptr_t i = 0; i < arguments.Length(); i++) {
+    param = arguments.At(i);
+    arguments_with_receiver.SetAt(i + 1, param);
   }
-  return EvaluateWithDFEHelper(
-      expr, param_names, type_param_names,
+
+  return EvaluateCompiledExpressionHelper(
+      kernel_bytes, kernel_length, type_definitions,
       String::Handle(Library::Handle(method_cls.library()).url()),
-      String::Handle(method_cls.UserVisibleName()), false, args,
-      type_param_values);
+      String::Handle(method_cls.UserVisibleName()), arguments_with_receiver,
+      type_arguments);
 }
 
 RawObject* Instance::HashCode() const {
@@ -18985,44 +19095,6 @@
       return Mint::NewCanonical(Mint::Cast(*this).value());
     case kDoubleCid:
       return Double::NewCanonical(Double::Cast(*this).value());
-    case kBigintCid: {
-      if (this->IsCanonical()) {
-        return this->raw();
-      }
-      Zone* zone = thread->zone();
-      Isolate* isolate = thread->isolate();
-      Bigint& result = Bigint::Handle(zone);
-      const Class& cls = Class::Handle(zone, this->clazz());
-      intptr_t index = 0;
-      result ^= cls.LookupCanonicalBigint(zone, Bigint::Cast(*this), &index);
-      if (!result.IsNull()) {
-        return result.raw();
-      }
-      {
-        SafepointMutexLocker ml(isolate->constant_canonicalization_mutex());
-        // Retry lookup.
-        {
-          result ^=
-              cls.LookupCanonicalBigint(zone, Bigint::Cast(*this), &index);
-          if (!result.IsNull()) {
-            return result.raw();
-          }
-        }
-
-        // The value needs to be added to the list. Grow the list if
-        // it is full.
-        result ^= this->raw();
-        ASSERT((isolate == Dart::vm_isolate()) || !result.InVMHeap());
-        if (result.IsNew()) {
-          // Create a canonical object in old space.
-          result ^= Object::Clone(result, Heap::kOld);
-        }
-        ASSERT(result.IsOld());
-        result.SetCanonical();
-        cls.InsertCanonicalBigint(zone, index, result);
-        return result.raw();
-      }
-    }
     default:
       UNREACHABLE();
   }
@@ -19032,7 +19104,6 @@
 #if defined(DEBUG)
 bool Number::CheckIsCanonical(Thread* thread) const {
   intptr_t cid = GetClassId();
-  intptr_t idx = 0;
   Zone* zone = thread->zone();
   const Class& cls = Class::Handle(zone, this->clazz());
   switch (cid) {
@@ -19048,11 +19119,6 @@
       dbl ^= cls.LookupCanonicalDouble(zone, Double::Cast(*this).value());
       return (dbl.raw() == this->raw());
     }
-    case kBigintCid: {
-      Bigint& result = Bigint::Handle(zone);
-      result ^= cls.LookupCanonicalBigint(zone, Bigint::Cast(*this), &idx);
-      return (result.raw() == this->raw());
-    }
     default:
       UNREACHABLE();
   }
@@ -19083,21 +19149,14 @@
   if (!OS::StringToInt64(cstr, &value)) {
     // TODO(T31600): Remove overflow checking code when 64-bit ints semantics
     // are only supported through the Kernel FE.
-    if (FLAG_limit_ints_to_64_bits) {
-      if (strcmp(cstr, kMaxInt64Plus1) == 0) {
-        // Allow MAX_INT64 + 1 integer literal as it can be used as an argument
-        // of unary minus to produce MIN_INT64 value. The value is automatically
-        // wrapped to MIN_INT64.
-        return Integer::New(kMinInt64, space);
-      }
-      // Out of range.
-      return Integer::null();
+    if (strcmp(cstr, kMaxInt64Plus1) == 0) {
+      // Allow MAX_INT64 + 1 integer literal as it can be used as an argument
+      // of unary minus to produce MIN_INT64 value. The value is automatically
+      // wrapped to MIN_INT64.
+      return Integer::New(kMinInt64, space);
     }
-    const Bigint& big =
-        Bigint::Handle(Bigint::NewFromCString(str.ToCString(), space));
-    ASSERT(!big.FitsIntoSmi());
-    ASSERT(!big.FitsIntoInt64());
-    return big.raw();
+    // Out of range.
+    return Integer::null();
   }
   return Integer::New(value, space);
 }
@@ -19110,20 +19169,14 @@
   if (!OS::StringToInt64(cstr, &value)) {
     // TODO(T31600): Remove overflow checking code when 64-bit ints semantics
     // are only supported through the Kernel FE.
-    if (FLAG_limit_ints_to_64_bits) {
-      if (strcmp(cstr, kMaxInt64Plus1) == 0) {
-        // Allow MAX_INT64 + 1 integer literal as it can be used as an argument
-        // of unary minus to produce MIN_INT64 value. The value is automatically
-        // wrapped to MIN_INT64.
-        return Mint::NewCanonical(kMinInt64);
-      }
-      // Out of range.
-      return Integer::null();
+    if (strcmp(cstr, kMaxInt64Plus1) == 0) {
+      // Allow MAX_INT64 + 1 integer literal as it can be used as an argument
+      // of unary minus to produce MIN_INT64 value. The value is automatically
+      // wrapped to MIN_INT64.
+      return Mint::NewCanonical(kMinInt64);
     }
-    const Bigint& big = Bigint::Handle(Bigint::NewCanonical(str));
-    ASSERT(!big.FitsIntoSmi());
-    ASSERT(!big.FitsIntoInt64());
-    return big.raw();
+    // Out of range.
+    return Integer::null();
   }
   if (Smi::IsValid(value)) {
     return Smi::New(static_cast<intptr_t>(value));
@@ -19140,19 +19193,11 @@
 }
 
 RawInteger* Integer::NewFromUint64(uint64_t value, Heap::Space space) {
-  if (!FLAG_limit_ints_to_64_bits &&
-      (value > static_cast<uint64_t>(Mint::kMaxValue))) {
-    return Bigint::NewFromUint64(value, space);
-  }
   return Integer::New(static_cast<int64_t>(value), space);
 }
 
 bool Integer::IsValueInRange(uint64_t value) {
-  if (FLAG_limit_ints_to_64_bits) {
-    return (value <= static_cast<uint64_t>(Mint::kMaxValue));
-  } else {
-    return true;
-  }
+  return (value <= static_cast<uint64_t>(Mint::kMaxValue));
 }
 
 bool Integer::Equals(const Instance& other) const {
@@ -19214,20 +19259,11 @@
       return raw();
     }
   }
-  if (Bigint::Cast(*this).FitsIntoInt64()) {
-    const int64_t value = AsInt64Value();
-    if (Smi::IsValid(value)) {
-      // This cast is safe because Smi::IsValid verifies that value will fit.
-      intptr_t val = static_cast<intptr_t>(value);
-      return Smi::New(val);
-    }
-    return Mint::New(value);
-  }
   return raw();
 }
 
 const char* Integer::ToHexCString(Zone* zone) const {
-  ASSERT(IsSmi() || IsMint());  // Bigint has its own implementation.
+  ASSERT(IsSmi() || IsMint());
   int64_t value = AsInt64Value();
   if (value < 0) {
     return OS::SCreate(zone, "-0x%" PX64, static_cast<uint64_t>(-value));
@@ -19259,21 +19295,9 @@
                               space);
         } else {
           ASSERT(sizeof(intptr_t) == sizeof(int64_t));
-          if (FLAG_limit_ints_to_64_bits) {
-            return Integer::New(
-                Utils::MulWithWrapAround(left_value, right_value), space);
-          } else {
-            // In 64-bit mode, the product of two signed integers fits in a
-            // 64-bit result if the sum of the highest bits of their absolute
-            // values is smaller than 62.
-            if ((Utils::HighestBit(left_value) +
-                 Utils::HighestBit(right_value)) < 62) {
-              return Integer::New(left_value * right_value, space);
-            }
-          }
+          return Integer::New(Utils::MulWithWrapAround(left_value, right_value),
+                              space);
         }
-        // Perform a Bigint multiplication below.
-        break;
       }
       case Token::kTRUNCDIV:
         return Integer::New(left_value / right_value, space);
@@ -19292,77 +19316,45 @@
         UNIMPLEMENTED();
     }
   }
-  if (!IsBigint() && !other.IsBigint()) {
-    const int64_t left_value = AsInt64Value();
-    const int64_t right_value = other.AsInt64Value();
-    switch (operation) {
-      case Token::kADD: {
-        if (FLAG_limit_ints_to_64_bits) {
-          return Integer::New(Utils::AddWithWrapAround(left_value, right_value),
-                              space);
-        } else {
-          if (!Utils::WillAddOverflow(left_value, right_value)) {
-            return Integer::New(left_value + right_value, space);
-          }
-        }
-        break;
-      }
-      case Token::kSUB: {
-        if (FLAG_limit_ints_to_64_bits) {
-          return Integer::New(Utils::SubWithWrapAround(left_value, right_value),
-                              space);
-        } else {
-          if (!Utils::WillSubOverflow(left_value, right_value)) {
-            return Integer::New(left_value - right_value, space);
-          }
-        }
-        break;
-      }
-      case Token::kMUL: {
-        if (FLAG_limit_ints_to_64_bits) {
-          return Integer::New(Utils::MulWithWrapAround(left_value, right_value),
-                              space);
-        } else {
-          if ((Utils::HighestBit(left_value) + Utils::HighestBit(right_value)) <
-              62) {
-            return Integer::New(left_value * right_value, space);
-          }
-        }
-        break;
-      }
-      case Token::kTRUNCDIV: {
-        if ((left_value == Mint::kMinValue) && (right_value == -1)) {
-          // Division special case: overflow in int64_t.
-          if (FLAG_limit_ints_to_64_bits) {
-            // MIN_VALUE / -1 = (MAX_VALUE + 1), which wraps around to MIN_VALUE
-            return Integer::New(Mint::kMinValue, space);
-          }
-        } else {
-          return Integer::New(left_value / right_value, space);
-        }
-        break;
-      }
-      case Token::kMOD: {
-        const int64_t remainder = left_value % right_value;
-        if (remainder < 0) {
-          if (right_value < 0) {
-            return Integer::New(remainder - right_value, space);
-          } else {
-            return Integer::New(remainder + right_value, space);
-          }
-        }
-        return Integer::New(remainder, space);
-      }
-      default:
-        UNIMPLEMENTED();
-    }
-  }
-  ASSERT(!Bigint::IsDisabled());
-  return Integer::null();  // Notify caller that a bigint operation is required.
-}
+  const int64_t left_value = AsInt64Value();
+  const int64_t right_value = other.AsInt64Value();
+  switch (operation) {
+    case Token::kADD:
+      return Integer::New(Utils::AddWithWrapAround(left_value, right_value),
+                          space);
 
-static bool Are64bitOperands(const Integer& op1, const Integer& op2) {
-  return !op1.IsBigint() && !op2.IsBigint();
+    case Token::kSUB:
+      return Integer::New(Utils::SubWithWrapAround(left_value, right_value),
+                          space);
+
+    case Token::kMUL:
+      return Integer::New(Utils::MulWithWrapAround(left_value, right_value),
+                          space);
+
+    case Token::kTRUNCDIV:
+      if ((left_value == Mint::kMinValue) && (right_value == -1)) {
+        // Division special case: overflow in int64_t.
+        // MIN_VALUE / -1 = (MAX_VALUE + 1), which wraps around to MIN_VALUE
+        return Integer::New(Mint::kMinValue, space);
+      } else {
+        return Integer::New(left_value / right_value, space);
+      }
+
+    case Token::kMOD: {
+      const int64_t remainder = left_value % right_value;
+      if (remainder < 0) {
+        if (right_value < 0) {
+          return Integer::New(remainder - right_value, space);
+        } else {
+          return Integer::New(remainder + right_value, space);
+        }
+      }
+      return Integer::New(remainder, space);
+    }
+    default:
+      UNIMPLEMENTED();
+      return Integer::null();
+  }
 }
 
 RawInteger* Integer::BitOp(Token::Kind kind,
@@ -19387,7 +19379,7 @@
     }
     ASSERT(Smi::IsValid(result));
     return Smi::New(result);
-  } else if (Are64bitOperands(*this, other)) {
+  } else {
     int64_t a = AsInt64Value();
     int64_t b = other.AsInt64Value();
     switch (kind) {
@@ -19399,10 +19391,9 @@
         return Integer::New(a ^ b, space);
       default:
         UNIMPLEMENTED();
+        return Integer::null();
     }
   }
-  ASSERT(!Bigint::IsDisabled());
-  return Integer::null();  // Notify caller that a bigint operation is required.
 }
 
 // TODO(srdjan): Clarify handling of negative right operand in a shift op.
@@ -19421,18 +19412,8 @@
       {  // Check for overflow.
         int cnt = Utils::BitLength(left_value);
         if (right_value > (Smi::kBits - cnt)) {
-          if (FLAG_limit_ints_to_64_bits) {
-            return Integer::New(
-                Utils::ShiftLeftWithTruncation(left_value, right_value), space);
-          } else {
-            if (right_value > (Mint::kBits - cnt)) {
-              return Bigint::NewFromShiftedInt64(left_value, right_value,
-                                                 space);
-            } else {
-              int64_t left_64 = left_value;
-              return Integer::New(left_64 << right_value, space);
-            }
-          }
+          return Integer::New(
+              Utils::ShiftLeftWithTruncation(left_value, right_value), space);
         }
       }
       result = left_value << right_value;
@@ -19482,7 +19463,7 @@
     }
   }
   ASSERT(!other.FitsIntoSmi());
-  if (other.IsMint() || other.IsBigint()) {
+  if (other.IsMint()) {
     if (this->IsNegative() == other.IsNegative()) {
       return this->IsNegative() ? 1 : -1;
     }
@@ -19578,23 +19559,16 @@
 
 int Mint::CompareWith(const Integer& other) const {
   ASSERT(!FitsIntoSmi());
-  if (other.IsMint() || other.IsSmi()) {
-    int64_t a = AsInt64Value();
-    int64_t b = other.AsInt64Value();
-    if (a < b) {
-      return -1;
-    } else if (a > b) {
-      return 1;
-    } else {
-      return 0;
-    }
+  ASSERT(other.IsMint() || other.IsSmi());
+  int64_t a = AsInt64Value();
+  int64_t b = other.AsInt64Value();
+  if (a < b) {
+    return -1;
+  } else if (a > b) {
+    return 1;
+  } else {
+    return 0;
   }
-  ASSERT(other.IsBigint());
-  ASSERT(!Bigint::Cast(other).FitsIntoInt64());
-  if (this->IsNegative() == other.IsNegative()) {
-    return this->IsNegative() ? 1 : -1;
-  }
-  return this->IsNegative() ? -1 : 1;
 }
 
 const char* Mint::ToCString() const {
@@ -19724,730 +19698,6 @@
   return buffer;
 }
 
-bool Bigint::Neg() const {
-  return Bool::Handle(neg()).value();
-}
-
-void Bigint::SetNeg(bool value) const {
-  StorePointer(&raw_ptr()->neg_, Bool::Get(value).raw());
-}
-
-intptr_t Bigint::Used() const {
-  return Smi::Value(used());
-}
-
-void Bigint::SetUsed(intptr_t value) const {
-  StoreSmi(&raw_ptr()->used_, Smi::New(value));
-}
-
-uint32_t Bigint::DigitAt(intptr_t index) const {
-  const TypedData& typed_data = TypedData::Handle(digits());
-  return typed_data.GetUint32(index << 2);
-}
-
-void Bigint::set_digits(const TypedData& value) const {
-  // The VM expects digits_ to be a Uint32List (not null).
-  ASSERT(!value.IsNull() && (value.GetClassId() == kTypedDataUint32ArrayCid));
-  StorePointer(&raw_ptr()->digits_, value.raw());
-}
-
-RawTypedData* Bigint::NewDigits(intptr_t length, Heap::Space space) {
-  ASSERT(length > 0);
-  // Account for leading zero for 64-bit processing.
-  return TypedData::New(kTypedDataUint32ArrayCid, length + 1, space);
-}
-
-uint32_t Bigint::DigitAt(const TypedData& digits, intptr_t index) {
-  return digits.GetUint32(index << 2);
-}
-
-void Bigint::SetDigitAt(const TypedData& digits,
-                        intptr_t index,
-                        uint32_t value) {
-  digits.SetUint32(index << 2, value);
-}
-
-bool Bigint::Equals(const Instance& other) const {
-  if (this->raw() == other.raw()) {
-    // Both handles point to the same raw instance.
-    return true;
-  }
-
-  if (!other.IsBigint() || other.IsNull()) {
-    return false;
-  }
-
-  const Bigint& other_bgi = Bigint::Cast(other);
-
-  if (this->Neg() != other_bgi.Neg()) {
-    return false;
-  }
-
-  const intptr_t used = this->Used();
-  if (used != other_bgi.Used()) {
-    return false;
-  }
-
-  for (intptr_t i = 0; i < used; i++) {
-    if (this->DigitAt(i) != other_bgi.DigitAt(i)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-bool Bigint::CheckAndCanonicalizeFields(Thread* thread,
-                                        const char** error_str) const {
-  Zone* zone = thread->zone();
-  // Bool field neg should always be canonical.
-  ASSERT(Bool::Handle(zone, neg()).IsCanonical());
-  // Smi field used is canonical by definition.
-  if (Used() > 0) {
-    // Canonicalize TypedData field digits.
-    TypedData& digits_ = TypedData::Handle(zone, digits());
-    digits_ ^= digits_.CheckAndCanonicalize(thread, NULL);
-    ASSERT(!digits_.IsNull());
-    set_digits(digits_);
-  } else {
-    ASSERT(digits() == TypedData::EmptyUint32Array(Thread::Current()));
-  }
-  return true;
-}
-
-RawBigint* Bigint::New(Heap::Space space) {
-  ASSERT(!Bigint::IsDisabled());
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  Isolate* isolate = thread->isolate();
-  ASSERT(isolate->object_store()->bigint_class() != Class::null());
-  Bigint& result = Bigint::Handle(zone);
-  {
-    RawObject* raw =
-        Object::Allocate(Bigint::kClassId, Bigint::InstanceSize(), space);
-    NoSafepointScope no_safepoint;
-    result ^= raw;
-  }
-  result.SetNeg(false);
-  result.SetUsed(0);
-  result.set_digits(
-      TypedData::Handle(zone, TypedData::EmptyUint32Array(thread)));
-  return result.raw();
-}
-
-RawBigint* Bigint::New(bool neg,
-                       intptr_t used,
-                       const TypedData& digits,
-                       Heap::Space space) {
-  ASSERT(!Bigint::IsDisabled());
-  ASSERT((used == 0) ||
-         (!digits.IsNull() && (digits.Length() >= (used + (used & 1)))));
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  Isolate* isolate = thread->isolate();
-  ASSERT(isolate->object_store()->bigint_class() != Class::null());
-  Bigint& result = Bigint::Handle(zone);
-  {
-    RawObject* raw =
-        Object::Allocate(Bigint::kClassId, Bigint::InstanceSize(), space);
-    NoSafepointScope no_safepoint;
-    result ^= raw;
-  }
-  // Clamp the digits array.
-  while ((used > 0) && (digits.GetUint32((used - 1) << 2) == 0)) {
-    --used;
-  }
-  if (used > 0) {
-    if (((used & 1) != 0) && (digits.GetUint32(used << 2) != 0)) {
-      // Set leading zero for 64-bit processing of digit pairs if not set.
-      // The check above ensures that we avoid a write access to a possibly
-      // reused digits array that could be marked read only.
-      digits.SetUint32(used << 2, 0);
-    }
-    result.set_digits(digits);
-  } else {
-    neg = false;
-    result.set_digits(
-        TypedData::Handle(zone, TypedData::EmptyUint32Array(thread)));
-  }
-  result.SetNeg(neg);
-  result.SetUsed(used);
-  return result.raw();
-}
-
-RawBigint* Bigint::NewFromInt64(int64_t value, Heap::Space space) {
-  ASSERT(!Bigint::IsDisabled());
-  const TypedData& digits = TypedData::Handle(NewDigits(2, space));
-  bool neg;
-  uint64_t abs_value;
-  if (value < 0) {
-    neg = true;
-    abs_value = -value;
-  } else {
-    neg = false;
-    abs_value = value;
-  }
-  SetDigitAt(digits, 0, static_cast<uint32_t>(abs_value));
-  SetDigitAt(digits, 1, static_cast<uint32_t>(abs_value >> 32));
-  return New(neg, 2, digits, space);
-}
-
-RawBigint* Bigint::NewFromUint64(uint64_t value, Heap::Space space) {
-  ASSERT(!Bigint::IsDisabled());
-  const TypedData& digits = TypedData::Handle(NewDigits(2, space));
-  SetDigitAt(digits, 0, static_cast<uint32_t>(value));
-  SetDigitAt(digits, 1, static_cast<uint32_t>(value >> 32));
-  return New(false, 2, digits, space);
-}
-
-RawBigint* Bigint::NewFromShiftedInt64(int64_t value,
-                                       intptr_t shift,
-                                       Heap::Space space) {
-  ASSERT(!Bigint::IsDisabled());
-  ASSERT(kBitsPerDigit == 32);
-  ASSERT(shift >= 0);
-  const intptr_t digit_shift = shift / kBitsPerDigit;
-  const intptr_t bit_shift = shift % kBitsPerDigit;
-  const intptr_t used = 3 + digit_shift;
-  const TypedData& digits = TypedData::Handle(NewDigits(used, space));
-  bool neg;
-  uint64_t abs_value;
-  if (value < 0) {
-    neg = true;
-    abs_value = -value;
-  } else {
-    neg = false;
-    abs_value = value;
-  }
-  for (intptr_t i = 0; i < digit_shift; i++) {
-    SetDigitAt(digits, i, 0);
-  }
-  SetDigitAt(digits, 0 + digit_shift,
-             static_cast<uint32_t>(abs_value << bit_shift));
-  SetDigitAt(digits, 1 + digit_shift,
-             static_cast<uint32_t>(abs_value >> (32 - bit_shift)));
-  SetDigitAt(digits, 2 + digit_shift,
-             (bit_shift == 0)
-                 ? 0
-                 : static_cast<uint32_t>(abs_value >> (64 - bit_shift)));
-  return New(neg, used, digits, space);
-}
-
-RawBigint* Bigint::NewFromCString(const char* str, Heap::Space space) {
-  ASSERT(!Bigint::IsDisabled());
-  ASSERT(str != NULL);
-  bool neg = false;
-  TypedData& digits = TypedData::Handle();
-  if (str[0] == '-') {
-    ASSERT(str[1] != '-');
-    neg = true;
-    str++;
-  }
-  intptr_t used;
-  const intptr_t str_length = strlen(str);
-  if ((str_length >= 2) && (str[0] == '0') &&
-      ((str[1] == 'x') || (str[1] == 'X'))) {
-    digits = NewDigitsFromHexCString(&str[2], &used, space);
-  } else {
-    digits = NewDigitsFromDecCString(str, &used, space);
-  }
-  return New(neg, used, digits, space);
-}
-
-RawBigint* Bigint::NewCanonical(const String& str) {
-  ASSERT(!Bigint::IsDisabled());
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  Isolate* isolate = thread->isolate();
-  const Bigint& value =
-      Bigint::Handle(zone, Bigint::NewFromCString(str.ToCString(), Heap::kOld));
-  const Class& cls =
-      Class::Handle(zone, isolate->object_store()->bigint_class());
-  intptr_t index = 0;
-  Bigint& canonical_value = Bigint::Handle(zone);
-  canonical_value ^= cls.LookupCanonicalBigint(zone, value, &index);
-  if (!canonical_value.IsNull()) {
-    return canonical_value.raw();
-  }
-  {
-    SafepointMutexLocker ml(isolate->constant_canonicalization_mutex());
-    // Retry lookup.
-    {
-      canonical_value ^= cls.LookupCanonicalBigint(zone, value, &index);
-      if (!canonical_value.IsNull()) {
-        return canonical_value.raw();
-      }
-    }
-    value.SetCanonical();
-    // The value needs to be added to the constants list. Grow the list if
-    // it is full.
-    cls.InsertCanonicalBigint(zone, index, value);
-    return value.raw();
-  }
-}
-
-RawTypedData* Bigint::NewDigitsFromHexCString(const char* str,
-                                              intptr_t* used,
-                                              Heap::Space space) {
-  const int kBitsPerHexDigit = 4;
-  const int kHexDigitsPerDigit = 8;
-  const int kBitsPerDigit = kBitsPerHexDigit * kHexDigitsPerDigit;
-  intptr_t hex_i = strlen(str);  // Terminating byte excluded.
-  if ((hex_i <= 0) || (hex_i >= kMaxInt32)) {
-    FATAL("Fatal error parsing hex bigint: string too long or empty");
-  }
-  const intptr_t length = (hex_i + kHexDigitsPerDigit - 1) / kHexDigitsPerDigit;
-  const TypedData& digits = TypedData::Handle(NewDigits(length, space));
-  intptr_t used_ = 0;
-  uint32_t digit = 0;
-  intptr_t bit_i = 0;
-  while (--hex_i >= 0) {
-    digit += Utils::HexDigitToInt(str[hex_i]) << bit_i;
-    bit_i += kBitsPerHexDigit;
-    if (bit_i == kBitsPerDigit) {
-      bit_i = 0;
-      SetDigitAt(digits, used_++, digit);
-      digit = 0;
-    }
-  }
-  if (bit_i != 0) {
-    SetDigitAt(digits, used_++, digit);
-  }
-  *used = used_;
-  return digits.raw();
-}
-
-RawTypedData* Bigint::NewDigitsFromDecCString(const char* str,
-                                              intptr_t* used,
-                                              Heap::Space space) {
-  // Read 9 digits a time. 10^9 < 2^32.
-  const int kDecDigitsPerIteration = 9;
-  const uint32_t kTenMultiplier = 1000000000;
-  ASSERT(kBitsPerDigit == 32);
-  const intptr_t str_length = strlen(str);
-  if ((str_length <= 0) || (str_length >= kMaxInt32)) {
-    FATAL("Fatal error parsing dec bigint: string too long or empty");
-  }
-  // One decimal digit takes log2(10) bits, i.e. ~3.32192809489 bits.
-  // That is a theoretical limit for large numbers.
-  // The extra 5 digits allocated take care of variations.
-  const int64_t kLog10Dividend = 33219281;
-  const int64_t kLog10Divisor = 10000000;
-  const intptr_t length =
-      (kLog10Dividend * str_length) / (kLog10Divisor * kBitsPerDigit) + 5;
-  const TypedData& digits = TypedData::Handle(NewDigits(length, space));
-  // Read first digit separately. This avoids a multiplication and addition.
-  // The first digit might also not have kDecDigitsPerIteration decimal digits.
-  const intptr_t lsdigit_length = str_length % kDecDigitsPerIteration;
-  uint32_t digit = 0;
-  intptr_t str_pos = 0;
-  for (intptr_t i = 0; i < lsdigit_length; i++) {
-    char c = str[str_pos++];
-    ASSERT(('0' <= c) && (c <= '9'));
-    digit = digit * 10 + c - '0';
-  }
-  SetDigitAt(digits, 0, digit);
-  intptr_t used_ = 1;
-  // Read kDecDigitsPerIteration at a time, and store it in 'digit'.
-  // Then multiply the temporary result by 10^kDecDigitsPerIteration and add
-  // 'digit' to the new result.
-  while (str_pos < str_length - 1) {
-    digit = 0;
-    for (intptr_t i = 0; i < kDecDigitsPerIteration; i++) {
-      char c = str[str_pos++];
-      ASSERT(('0' <= c) && (c <= '9'));
-      digit = digit * 10 + c - '0';
-    }
-    // Multiply result with kTenMultiplier and add digit.
-    for (intptr_t i = 0; i < used_; i++) {
-      uint64_t product =
-          (static_cast<uint64_t>(DigitAt(digits, i)) * kTenMultiplier) + digit;
-      SetDigitAt(digits, i, static_cast<uint32_t>(product & kDigitMask));
-      digit = static_cast<uint32_t>(product >> kBitsPerDigit);
-    }
-    SetDigitAt(digits, used_++, digit);
-  }
-  *used = used_;
-  return digits.raw();
-}
-
-static double Uint64ToDouble(uint64_t x) {
-#if _WIN64
-  // For static_cast<double>(x) MSVC x64 generates
-  //
-  //    cvtsi2sd xmm0, rax
-  //    test  rax, rax
-  //    jns done
-  //    addsd xmm0, static_cast<double>(2^64)
-  //  done:
-  //
-  // while GCC -m64 generates
-  //
-  //    test rax, rax
-  //    js negative
-  //    cvtsi2sd xmm0, rax
-  //    jmp done
-  //  negative:
-  //    mov rdx, rax
-  //    shr rdx, 1
-  //    and eax, 0x1
-  //    or rdx, rax
-  //    cvtsi2sd xmm0, rdx
-  //    addsd xmm0, xmm0
-  //  done:
-  //
-  // which results in a different rounding.
-  //
-  // For consistency between platforms fallback to GCC style conversion
-  // on Win64.
-  //
-  const int64_t y = static_cast<int64_t>(x);
-  if (y > 0) {
-    return static_cast<double>(y);
-  } else {
-    const double half =
-        static_cast<double>(static_cast<int64_t>(x >> 1) | (y & 1));
-    return half + half;
-  }
-#else
-  return static_cast<double>(x);
-#endif
-}
-
-double Bigint::AsDoubleValue() const {
-  ASSERT(kBitsPerDigit == 32);
-  const intptr_t used = Used();
-  if (used == 0) {
-    return 0.0;
-  }
-  if (used <= 2) {
-    const uint64_t digit1 = (used > 1) ? DigitAt(1) : 0;
-    const uint64_t abs_value = (digit1 << 32) + DigitAt(0);
-    const double abs_double_value = Uint64ToDouble(abs_value);
-    return Neg() ? -abs_double_value : abs_double_value;
-  }
-
-  static const int kPhysicalSignificandSize = 52;
-  // The significand size has an additional hidden bit.
-  static const int kSignificandSize = kPhysicalSignificandSize + 1;
-  static const int kExponentBias = 0x3FF + kPhysicalSignificandSize;
-  static const int kMaxExponent = 0x7FF - kExponentBias;
-  static const uint64_t kOne64 = 1;
-  static const uint64_t kInfinityBits =
-      DART_2PART_UINT64_C(0x7FF00000, 00000000);
-
-  // A double is composed of an exponent e and a significand s. Its value equals
-  // s * 2^e. The significand has 53 bits of which the first one must always be
-  // 1 (at least for then numbers we are working with here) and is therefore
-  // omitted. The physical size of the significand is thus 52 bits.
-  // The exponent has 11 bits and is biased by 0x3FF + 52. For example an
-  // exponent e = 10 is written as 0x3FF + 52 + 10 (in the 11 bits that are
-  // reserved for the exponent).
-  // When converting the given bignum to a double we have to pay attention to
-  // the rounding. In particular we have to decide which double to pick if an
-  // input lies exactly between two doubles. As usual with double operations
-  // we pick the double with an even significand in such cases.
-  //
-  // General approach of this algorithm: Get 54 bits (one more than the
-  // significand size) of the bigint. If the last bit is then 1, then (without
-  // knowledge of the remaining bits) we could have a half-way number.
-  // If the second-to-last bit is odd then we know that we have to round up:
-  // if the remaining bits are not zero then the input lies closer to the higher
-  // double. If the remaining bits are zero then we have a half-way case and
-  // we need to round up too (rounding to the even double).
-  // If the second-to-last bit is even then we need to look at the remaining
-  // bits to determine if any of them is not zero. If that's the case then the
-  // number lies closer to the next-higher double. Otherwise we round the
-  // half-way case down to even.
-
-  if (((used - 1) * kBitsPerDigit) > (kMaxExponent + kSignificandSize)) {
-    // Does not fit into a double.
-    const double infinity = bit_cast<double>(kInfinityBits);
-    return Neg() ? -infinity : infinity;
-  }
-
-  intptr_t digit_index = used - 1;
-  // In order to round correctly we need to look at half-way cases. Therefore we
-  // get kSignificandSize + 1 bits. If the last bit is 1 then we have to look
-  // at the remaining bits to know if we have to round up.
-  int needed_bits = kSignificandSize + 1;
-  ASSERT((kBitsPerDigit < needed_bits) && (2 * kBitsPerDigit >= needed_bits));
-  bool discarded_bits_were_zero = true;
-
-  const uint32_t firstDigit = DigitAt(digit_index--);
-  ASSERT(firstDigit > 0);
-  uint64_t twice_significand_floor = firstDigit;
-  intptr_t twice_significant_exponent = (digit_index + 1) * kBitsPerDigit;
-  needed_bits -= Utils::HighestBit(firstDigit) + 1;
-
-  if (needed_bits >= kBitsPerDigit) {
-    twice_significand_floor <<= kBitsPerDigit;
-    twice_significand_floor |= DigitAt(digit_index--);
-    twice_significant_exponent -= kBitsPerDigit;
-    needed_bits -= kBitsPerDigit;
-  }
-  if (needed_bits > 0) {
-    ASSERT(needed_bits <= kBitsPerDigit);
-    uint32_t digit = DigitAt(digit_index--);
-    int discarded_bits_count = kBitsPerDigit - needed_bits;
-    twice_significand_floor <<= needed_bits;
-    twice_significand_floor |= digit >> discarded_bits_count;
-    twice_significant_exponent -= needed_bits;
-    uint64_t discarded_bits_mask = (kOne64 << discarded_bits_count) - 1;
-    discarded_bits_were_zero = ((digit & discarded_bits_mask) == 0);
-  }
-  ASSERT((twice_significand_floor >> kSignificandSize) == 1);
-
-  // We might need to round up the significand later.
-  uint64_t significand = twice_significand_floor >> 1;
-  const intptr_t exponent = twice_significant_exponent + 1;
-
-  if (exponent >= kMaxExponent) {
-    // Infinity.
-    // Does not fit into a double.
-    const double infinity = bit_cast<double>(kInfinityBits);
-    return Neg() ? -infinity : infinity;
-  }
-
-  if ((twice_significand_floor & 1) == 1) {
-    bool round_up = false;
-
-    if ((significand & 1) != 0 || !discarded_bits_were_zero) {
-      // Even if the remaining bits are zero we still need to round up since we
-      // want to round to even for half-way cases.
-      round_up = true;
-    } else {
-      // Could be a half-way case. See if the remaining bits are non-zero.
-      for (intptr_t i = 0; i <= digit_index; i++) {
-        if (DigitAt(i) != 0) {
-          round_up = true;
-          break;
-        }
-      }
-    }
-
-    if (round_up) {
-      significand++;
-      // It might be that we just went from 53 bits to 54 bits.
-      // Example: After adding 1 to 1FFF..FF (with 53 bits set to 1) we have
-      // 2000..00 (= 2 ^ 54). When adding the exponent and significand together
-      // this will increase the exponent by 1 which is exactly what we want.
-    }
-  }
-
-  ASSERT(((significand >> (kSignificandSize - 1)) == 1) ||
-         (significand == (kOne64 << kSignificandSize)));
-  // The significand still has the hidden bit. We simply decrement the biased
-  // exponent by one instead of playing around with the significand.
-  const uint64_t biased_exponent = exponent + kExponentBias - 1;
-  // Note that we must use the plus operator instead of bit-or.
-  const uint64_t double_bits =
-      (biased_exponent << kPhysicalSignificandSize) + significand;
-
-  const double value = bit_cast<double>(double_bits);
-  return Neg() ? -value : value;
-}
-
-bool Bigint::FitsIntoSmi() const {
-  return FitsIntoInt64() && Smi::IsValid(AsInt64Value());
-}
-
-bool Bigint::FitsIntoInt64() const {
-  ASSERT(Bigint::kBitsPerDigit == 32);
-  const intptr_t used = Used();
-  if (used < 2) return true;
-  if (used > 2) return false;
-  const uint64_t digit1 = DigitAt(1);
-  const uint64_t value = (digit1 << 32) + DigitAt(0);
-  uint64_t limit = Mint::kMaxValue;
-  if (Neg()) {
-    limit++;
-  }
-  return value <= limit;
-}
-
-int64_t Bigint::AsTruncatedInt64Value() const {
-  const intptr_t used = Used();
-  if (used == 0) return 0;
-  const int64_t digit1 = (used > 1) ? DigitAt(1) : 0;
-  const int64_t value = (digit1 << 32) + DigitAt(0);
-  return Neg() ? -value : value;
-}
-
-int64_t Bigint::AsInt64Value() const {
-  ASSERT(FitsIntoInt64());
-  return AsTruncatedInt64Value();
-}
-
-bool Bigint::FitsIntoUint64() const {
-  ASSERT(Bigint::kBitsPerDigit == 32);
-  return !Neg() && (Used() <= 2);
-}
-
-uint64_t Bigint::AsUint64Value() const {
-  ASSERT(FitsIntoUint64());
-  const intptr_t used = Used();
-  if (used == 0) return 0;
-  const uint64_t digit1 = (used > 1) ? DigitAt(1) : 0;
-  return (digit1 << 32) + DigitAt(0);
-}
-
-uint32_t Bigint::AsTruncatedUint32Value() const {
-  // Note: the previous implementation of Bigint returned the absolute value
-  // truncated to 32 bits, which is not consistent with Smi and Mint behavior.
-  ASSERT(Bigint::kBitsPerDigit == 32);
-  const intptr_t used = Used();
-  if (used == 0) return 0;
-  const uint32_t digit0 = DigitAt(0);
-  return Neg() ? static_cast<uint32_t>(-static_cast<int32_t>(digit0)) : digit0;
-}
-
-// For positive values: Smi < Mint < Bigint.
-int Bigint::CompareWith(const Integer& other) const {
-  ASSERT(!FitsIntoSmi());
-  ASSERT(!FitsIntoInt64());
-  if (other.IsBigint() && (IsNegative() == other.IsNegative())) {
-    const Bigint& other_bgi = Bigint::Cast(other);
-    int64_t result = Used() - other_bgi.Used();
-    if (result == 0) {
-      for (intptr_t i = Used(); --i >= 0;) {
-        result = DigitAt(i);
-        result -= other_bgi.DigitAt(i);
-        if (result != 0) break;
-      }
-    }
-    if (IsNegative()) {
-      result = -result;
-    }
-    return result > 0 ? 1 : result < 0 ? -1 : 0;
-  }
-  return this->IsNegative() ? -1 : 1;
-}
-
-const char* Bigint::ToDecCString(Zone* zone) const {
-  // log10(2) ~= 0.30102999566398114.
-  const intptr_t kLog2Dividend = 30103;
-  const intptr_t kLog2Divisor = 100000;
-  intptr_t used = Used();
-  const intptr_t kMaxUsed =
-      kIntptrMax / kBitsPerDigit / kLog2Dividend * kLog2Divisor;
-  if (used > kMaxUsed) {
-    Exceptions::ThrowOOM();
-    UNREACHABLE();
-  }
-  const int64_t bit_len = used * kBitsPerDigit;
-  const int64_t dec_len = (bit_len * kLog2Dividend / kLog2Divisor) + 1;
-  // Add one byte for the minus sign and for the trailing \0 character.
-  const int64_t len = (Neg() ? 1 : 0) + dec_len + 1;
-  char* chars = zone->Alloc<char>(len);
-  intptr_t pos = 0;
-  const intptr_t kDivisor = 100000000;
-  const intptr_t kDigits = 8;
-  ASSERT(pow(10.0, 1.0 * kDigits) == kDivisor);
-  ASSERT(kDivisor < kDigitBase);
-  ASSERT(Smi::IsValid(kDivisor));
-  // Allocate a copy of the digits.
-  uint32_t* rest_digits = zone->Alloc<uint32_t>(used);
-  for (intptr_t i = 0; i < used; i++) {
-    rest_digits[i] = DigitAt(i);
-  }
-  if (used == 0) {
-    chars[pos++] = '0';
-  }
-  while (used > 0) {
-    uint32_t remainder = 0;
-    for (intptr_t i = used - 1; i >= 0; i--) {
-      uint64_t dividend =
-          (static_cast<uint64_t>(remainder) << kBitsPerDigit) + rest_digits[i];
-      uint32_t quotient = static_cast<uint32_t>(dividend / kDivisor);
-      remainder = static_cast<uint32_t>(
-          dividend - static_cast<uint64_t>(quotient) * kDivisor);
-      rest_digits[i] = quotient;
-    }
-    // Clamp rest_digits.
-    while ((used > 0) && (rest_digits[used - 1] == 0)) {
-      used--;
-    }
-    for (intptr_t i = 0; i < kDigits; i++) {
-      chars[pos++] = '0' + (remainder % 10);
-      remainder /= 10;
-    }
-    ASSERT(remainder == 0);
-  }
-  // Remove leading zeros.
-  while ((pos > 1) && (chars[pos - 1] == '0')) {
-    pos--;
-  }
-  if (Neg()) {
-    chars[pos++] = '-';
-  }
-  // Reverse the string.
-  intptr_t i = 0;
-  intptr_t j = pos - 1;
-  while (i < j) {
-    char tmp = chars[i];
-    chars[i] = chars[j];
-    chars[j] = tmp;
-    i++;
-    j--;
-  }
-  chars[pos] = '\0';
-  return chars;
-}
-
-const char* Bigint::ToHexCString(Zone* zone) const {
-  const intptr_t used = Used();
-  if (used == 0) {
-    const char* zero = "0x0";
-    const size_t len = strlen(zero) + 1;
-    char* chars = zone->Alloc<char>(len);
-    strncpy(chars, zero, len);
-    return chars;
-  }
-  const int kBitsPerHexDigit = 4;
-  const int kHexDigitsPerDigit = 8;
-  const intptr_t kMaxUsed = (kIntptrMax - 4) / kHexDigitsPerDigit;
-  if (used > kMaxUsed) {
-    Exceptions::ThrowOOM();
-    UNREACHABLE();
-  }
-  intptr_t hex_len = (used - 1) * kHexDigitsPerDigit;
-  // The most significant digit may use fewer than kHexDigitsPerDigit digits.
-  uint32_t digit = DigitAt(used - 1);
-  ASSERT(digit != 0);  // Value must be clamped.
-  while (digit != 0) {
-    hex_len++;
-    digit >>= kBitsPerHexDigit;
-  }
-  // Add bytes for '0x', for the minus sign, and for the trailing \0 character.
-  const int32_t len = (Neg() ? 1 : 0) + 2 + hex_len + 1;
-  char* chars = zone->Alloc<char>(len);
-  intptr_t pos = len;
-  chars[--pos] = '\0';
-  for (intptr_t i = 0; i < (used - 1); i++) {
-    digit = DigitAt(i);
-    for (intptr_t j = 0; j < kHexDigitsPerDigit; j++) {
-      chars[--pos] = Utils::IntToHexDigit(digit & 0xf);
-      digit >>= kBitsPerHexDigit;
-    }
-  }
-  digit = DigitAt(used - 1);
-  while (digit != 0) {
-    chars[--pos] = Utils::IntToHexDigit(digit & 0xf);
-    digit >>= kBitsPerHexDigit;
-  }
-  chars[--pos] = 'x';
-  chars[--pos] = '0';
-  if (Neg()) {
-    chars[--pos] = '-';
-  }
-  ASSERT(pos == 0);
-  return chars;
-}
-
-const char* Bigint::ToCString() const {
-  return ToDecCString(Thread::Current()->zone());
-}
-
 // Synchronize with implementation in compiler (intrinsifier).
 class StringHasher : ValueObject {
  public:
@@ -20531,7 +19781,7 @@
       ASSERT(raw->IsExternalOneByteString());
       RawExternalOneByteString* str =
           reinterpret_cast<RawExternalOneByteString*>(raw);
-      data = str->ptr()->external_data_->data();
+      data = str->ptr()->external_data_;
     }
     return String::Hash(data, length);
   } else {
@@ -20542,7 +19792,7 @@
       ASSERT(raw->IsExternalTwoByteString());
       RawExternalTwoByteString* str =
           reinterpret_cast<RawExternalTwoByteString*>(raw);
-      data = str->ptr()->external_data_->data();
+      data = str->ptr()->external_data_;
     }
     return String::Hash(data, length);
   }
@@ -20868,17 +20118,21 @@
 RawString* String::NewExternal(const uint8_t* characters,
                                intptr_t len,
                                void* peer,
-                               Dart_PeerFinalizer callback,
+                               intptr_t external_allocation_size,
+                               Dart_WeakPersistentHandleFinalizer callback,
                                Heap::Space space) {
-  return ExternalOneByteString::New(characters, len, peer, callback, space);
+  return ExternalOneByteString::New(characters, len, peer,
+                                    external_allocation_size, callback, space);
 }
 
 RawString* String::NewExternal(const uint16_t* characters,
                                intptr_t len,
                                void* peer,
-                               Dart_PeerFinalizer callback,
+                               intptr_t external_allocation_size,
+                               Dart_WeakPersistentHandleFinalizer callback,
                                Heap::Space space) {
-  return ExternalTwoByteString::New(characters, len, peer, callback, space);
+  return ExternalTwoByteString::New(characters, len, peer,
+                                    external_allocation_size, callback, space);
 }
 
 void String::Copy(const String& dst,
@@ -21264,8 +20518,7 @@
     void* peer,
     Dart_WeakPersistentHandleFinalizer callback,
     intptr_t external_size) {
-  ASSERT((callback != NULL && peer != NULL) ||
-         (callback == NULL && peer == NULL));
+  ASSERT(callback != NULL);
   return FinalizablePersistentHandle::New(Isolate::Current(), referent, peer,
                                           callback, external_size);
 }
@@ -21689,24 +20942,6 @@
   return result;
 }
 
-void OneByteString::SetPeer(const String& str,
-                            intptr_t external_size,
-                            void* peer,
-                            Dart_PeerFinalizer cback) {
-  ASSERT(!str.IsNull() && str.IsOneByteString());
-  ASSERT(peer != NULL);
-  ExternalStringData<uint8_t>* ext_data =
-      new ExternalStringData<uint8_t>(NULL, peer, cback);
-  AddFinalizer(str, ext_data, OneByteString::Finalize, external_size);
-  Isolate::Current()->heap()->SetPeer(str.raw(), peer);
-}
-
-void OneByteString::Finalize(void* isolate_callback_data,
-                             Dart_WeakPersistentHandle handle,
-                             void* peer) {
-  delete reinterpret_cast<ExternalStringData<uint8_t>*>(peer);
-}
-
 RawTwoByteString* TwoByteString::EscapeSpecialCharacters(const String& str) {
   intptr_t len = str.Length();
   if (len > 0) {
@@ -21886,29 +21121,12 @@
   return TwoByteString::raw(result);
 }
 
-void TwoByteString::SetPeer(const String& str,
-                            intptr_t external_size,
-                            void* peer,
-                            Dart_PeerFinalizer cback) {
-  ASSERT(!str.IsNull() && str.IsTwoByteString());
-  ASSERT(peer != NULL);
-  ExternalStringData<uint16_t>* ext_data =
-      new ExternalStringData<uint16_t>(NULL, peer, cback);
-  AddFinalizer(str, ext_data, TwoByteString::Finalize, external_size);
-  Isolate::Current()->heap()->SetPeer(str.raw(), peer);
-}
-
-void TwoByteString::Finalize(void* isolate_callback_data,
-                             Dart_WeakPersistentHandle handle,
-                             void* peer) {
-  delete reinterpret_cast<ExternalStringData<uint16_t>*>(peer);
-}
-
 RawExternalOneByteString* ExternalOneByteString::New(
     const uint8_t* data,
     intptr_t len,
     void* peer,
-    Dart_PeerFinalizer callback,
+    intptr_t external_allocation_size,
+    Dart_WeakPersistentHandleFinalizer callback,
     Heap::Space space) {
   ASSERT(Isolate::Current()->object_store()->external_one_byte_string_class() !=
          Class::null());
@@ -21918,8 +21136,6 @@
            len);
   }
   String& result = String::Handle();
-  ExternalStringData<uint8_t>* external_data =
-      new ExternalStringData<uint8_t>(data, peer, callback);
   {
     RawObject* raw =
         Object::Allocate(ExternalOneByteString::kClassId,
@@ -21928,25 +21144,18 @@
     result ^= raw;
     result.SetLength(len);
     result.SetHash(0);
-    SetExternalData(result, external_data);
+    SetExternalData(result, data, peer);
   }
-  intptr_t external_size = len;
-  AddFinalizer(result, external_data, ExternalOneByteString::Finalize,
-               external_size);
+  AddFinalizer(result, peer, callback, external_allocation_size);
   return ExternalOneByteString::raw(result);
 }
 
-void ExternalOneByteString::Finalize(void* isolate_callback_data,
-                                     Dart_WeakPersistentHandle handle,
-                                     void* peer) {
-  delete reinterpret_cast<ExternalStringData<uint8_t>*>(peer);
-}
-
 RawExternalTwoByteString* ExternalTwoByteString::New(
     const uint16_t* data,
     intptr_t len,
     void* peer,
-    Dart_PeerFinalizer callback,
+    intptr_t external_allocation_size,
+    Dart_WeakPersistentHandleFinalizer callback,
     Heap::Space space) {
   ASSERT(Isolate::Current()->object_store()->external_two_byte_string_class() !=
          Class::null());
@@ -21956,8 +21165,6 @@
            len);
   }
   String& result = String::Handle();
-  ExternalStringData<uint16_t>* external_data =
-      new ExternalStringData<uint16_t>(data, peer, callback);
   {
     RawObject* raw =
         Object::Allocate(ExternalTwoByteString::kClassId,
@@ -21966,20 +21173,12 @@
     result ^= raw;
     result.SetLength(len);
     result.SetHash(0);
-    SetExternalData(result, external_data);
+    SetExternalData(result, data, peer);
   }
-  intptr_t external_size = len * 2;
-  AddFinalizer(result, external_data, ExternalTwoByteString::Finalize,
-               external_size);
+  AddFinalizer(result, peer, callback, external_allocation_size);
   return ExternalTwoByteString::raw(result);
 }
 
-void ExternalTwoByteString::Finalize(void* isolate_callback_data,
-                                     Dart_WeakPersistentHandle handle,
-                                     void* peer) {
-  delete reinterpret_cast<ExternalStringData<uint16_t>*>(peer);
-}
-
 RawBool* Bool::New(bool value) {
   ASSERT(Isolate::Current()->object_store()->bool_class() != Class::null());
   Bool& result = Bool::Handle();
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 41efcde..e09544a 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1221,13 +1221,6 @@
   RawDouble* LookupCanonicalDouble(Zone* zone, double value) const;
   RawMint* LookupCanonicalMint(Zone* zone, int64_t value) const;
 
-  // Returns an instance of Bigint or Bigint::null().
-  // 'index' points to either:
-  // - constants_list_ position of found element, or
-  // - constants_list_ position where new canonical can be inserted.
-  RawBigint* LookupCanonicalBigint(Zone* zone,
-                                   const Bigint& value,
-                                   intptr_t* index) const;
   // The methods above are more efficient than this generic one.
   RawInstance* LookupCanonicalInstance(Zone* zone, const Instance& value) const;
 
@@ -1235,9 +1228,6 @@
                                        const Instance& constant) const;
   void InsertCanonicalDouble(Zone* zone, const Double& constant) const;
   void InsertCanonicalMint(Zone* zone, const Mint& constant) const;
-  void InsertCanonicalBigint(Zone* zone,
-                             intptr_t index,
-                             const Bigint& constant) const;
 
   void RehashConstants(Zone* zone) const;
 
@@ -1389,6 +1379,12 @@
                       const Array& param_values,
                       const Array& type_param_names,
                       const TypeArguments& type_param_values) const;
+  RawObject* EvaluateCompiledExpression(
+      const uint8_t* kernel_bytes,
+      intptr_t kernel_length,
+      const Array& type_definitions,
+      const Array& param_values,
+      const TypeArguments& type_param_values) const;
 
   RawError* EnsureIsFinalized(Thread* thread) const;
 
@@ -3759,6 +3755,13 @@
                       const Array& type_param_names,
                       const TypeArguments& type_arguments) const;
 
+  RawObject* EvaluateCompiledExpression(
+      const uint8_t* kernel_bytes,
+      intptr_t kernel_length,
+      const Array& type_definitions,
+      const Array& param_values,
+      const TypeArguments& type_param_values) const;
+
   // Library scope name dictionary.
   //
   // TODO(turnidge): The Lookup functions are not consistent in how
@@ -5633,6 +5636,14 @@
                       const Array& type_param_names,
                       const TypeArguments& type_param_values) const;
 
+  RawObject* EvaluateCompiledExpression(
+      const Class& method_cls,
+      const uint8_t* kernel_bytes,
+      intptr_t kernel_length,
+      const Array& type_definitions,
+      const Array& param_values,
+      const TypeArguments& type_param_values) const;
+
   // Equivalent to invoking hashCode on this instance.
   virtual RawObject* HashCode() const;
 
@@ -6780,13 +6791,13 @@
   static RawInteger* New(const String& str, Heap::Space space = Heap::kNew);
 
   // Creates a new Integer by given uint64_t value.
-  // In the --limit-ints-to-64-bits mode silently casts value to int64_t
-  // (with wrap-around if it is greater than kMaxInt64).
+  // Silently casts value to int64_t with wrap-around if it is greater
+  // than kMaxInt64.
   static RawInteger* NewFromUint64(uint64_t value,
                                    Heap::Space space = Heap::kNew);
 
   // Returns a canonical Integer object allocated in the old gen space.
-  // Returns null if integer is out of range (in --limit-ints-to-64-bits mode).
+  // Returns null if integer is out of range.
   static RawInteger* NewCanonical(const String& str);
 
   static RawInteger* New(int64_t value, Heap::Space space = Heap::kNew);
@@ -6819,9 +6830,7 @@
   virtual int CompareWith(const Integer& other) const;
 
   // Converts integer to hex string.
-  // TODO(alexmarkov): this method can become non-virtual once Bigint class is
-  // decoupled from Integer hierarchy.
-  virtual const char* ToHexCString(Zone* zone) const;
+  const char* ToHexCString(Zone* zone) const;
 
   // Return the most compact presentation of an integer.
   RawInteger* AsValidInteger() const;
@@ -6967,107 +6976,6 @@
   friend class Number;
 };
 
-class Bigint : public Integer {
- public:
-  virtual bool IsZero() const { return Used() == 0; }
-  virtual bool IsNegative() const { return Neg(); }
-  virtual bool Equals(const Instance& other) const;
-
-  virtual double AsDoubleValue() const;
-  virtual int64_t AsInt64Value() const;
-  virtual int64_t AsTruncatedInt64Value() const;
-  virtual uint32_t AsTruncatedUint32Value() const;
-
-  virtual int CompareWith(const Integer& other) const;
-
-  virtual const char* ToHexCString(Zone* zone) const;
-
-  virtual bool CheckAndCanonicalizeFields(Thread* thread,
-                                          const char** error_str) const;
-
-  virtual bool FitsIntoSmi() const;
-  bool FitsIntoInt64() const;
-  bool FitsIntoUint64() const;
-  uint64_t AsUint64Value() const;
-
-  static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawBigint));
-  }
-
-  // Offsets of fields accessed directly by optimized code.
-  static intptr_t neg_offset() { return OFFSET_OF(RawBigint, neg_); }
-  static intptr_t used_offset() { return OFFSET_OF(RawBigint, used_); }
-  static intptr_t digits_offset() { return OFFSET_OF(RawBigint, digits_); }
-
-  // Accessors used by native calls from Dart.
-  RawBool* neg() const { return raw_ptr()->neg_; }
-  RawSmi* used() const { return raw_ptr()->used_; }
-  RawTypedData* digits() const { return raw_ptr()->digits_; }
-
-  // Accessors used by runtime calls from C++.
-  bool Neg() const;
-  intptr_t Used() const;
-  uint32_t DigitAt(intptr_t index) const;
-
-  const char* ToDecCString(Zone* zone) const;
-
-  static const intptr_t kBitsPerDigit = 32;  // Same as _Bigint._DIGIT_BITS
-  static const intptr_t kBytesPerDigit = 4;
-  static const int64_t kDigitBase = 1LL << kBitsPerDigit;
-  static const int64_t kDigitMask = kDigitBase - 1;
-
-  static RawBigint* New(Heap::Space space = Heap::kNew);  // For snapshots.
-
-  static RawBigint* New(bool neg,
-                        intptr_t used,
-                        const TypedData& digits,
-                        Heap::Space space = Heap::kNew);
-
-  static RawBigint* NewFromInt64(int64_t value, Heap::Space space = Heap::kNew);
-
-  static RawBigint* NewFromUint64(uint64_t value,
-                                  Heap::Space space = Heap::kNew);
-
-  static RawBigint* NewFromShiftedInt64(int64_t value,
-                                        intptr_t shift,
-                                        Heap::Space space = Heap::kNew);
-
-  static RawBigint* NewFromCString(const char* str,
-                                   Heap::Space space = Heap::kNew);
-
-  // Returns a canonical Bigint object allocated in the old gen space.
-  static RawBigint* NewCanonical(const String& str);
-
-  // Returns true if Bigint can't be instantiated.
-  static bool IsDisabled() { return FLAG_limit_ints_to_64_bits; }
-
- private:
-  void SetNeg(bool value) const;
-  void SetUsed(intptr_t value) const;
-  void set_digits(const TypedData& value) const;
-
-  // Convenience helpers.
-  static RawTypedData* NewDigits(intptr_t length,
-                                 Heap::Space space = Heap::kNew);
-  static uint32_t DigitAt(const TypedData& digits, intptr_t index);
-  static void SetDigitAt(const TypedData& digits,
-                         intptr_t index,
-                         uint32_t value);
-
-  static RawTypedData* NewDigitsFromHexCString(const char* str,
-                                               intptr_t* used,
-                                               Heap::Space space = Heap::kNew);
-
-  static RawTypedData* NewDigitsFromDecCString(const char* str,
-                                               intptr_t* used,
-                                               Heap::Space space = Heap::kNew);
-
-  static RawBigint* Allocate(intptr_t length, Heap::Space space = Heap::kNew);
-
-  FINAL_HEAP_OBJECT_IMPLEMENTATION(Bigint, Integer);
-  friend class Class;
-};
-
 // Class Double represents class Double in corelib_impl, which implements
 // abstract class double in corelib.
 class Double : public Number {
@@ -7303,7 +7211,8 @@
   static RawString* NewExternal(const uint8_t* utf8_array,
                                 intptr_t array_len,
                                 void* peer,
-                                Dart_PeerFinalizer callback,
+                                intptr_t external_allocation_size,
+                                Dart_WeakPersistentHandleFinalizer callback,
                                 Heap::Space = Heap::kNew);
 
   // Creates a new External String object using the specified array of
@@ -7311,7 +7220,8 @@
   static RawString* NewExternal(const uint16_t* utf16_array,
                                 intptr_t array_len,
                                 void* peer,
-                                Dart_PeerFinalizer callback,
+                                intptr_t external_allocation_size,
+                                Dart_WeakPersistentHandleFinalizer callback,
                                 Heap::Space = Heap::kNew);
 
   static void Copy(const String& dst,
@@ -7537,13 +7447,9 @@
                                               Heap::Space space);
 
   static void SetPeer(const String& str,
-                      intptr_t external_size,
                       void* peer,
-                      Dart_PeerFinalizer cback);
-
-  static void Finalize(void* isolate_callback_data,
-                       Dart_WeakPersistentHandle handle,
-                       void* peer);
+                      intptr_t external_allocation_size,
+                      Dart_WeakPersistentHandleFinalizer callback);
 
   static const ClassId kClassId = kOneByteStringCid;
 
@@ -7664,13 +7570,9 @@
                                      Heap::Space space);
 
   static void SetPeer(const String& str,
-                      intptr_t external_size,
                       void* peer,
-                      Dart_PeerFinalizer cback);
-
-  static void Finalize(void* isolate_callback_data,
-                       Dart_WeakPersistentHandle handle,
-                       void* peer);
+                      intptr_t external_allocation_size,
+                      Dart_WeakPersistentHandleFinalizer callback);
 
   static RawTwoByteString* null() {
     return reinterpret_cast<RawTwoByteString*>(Object::null());
@@ -7719,9 +7621,7 @@
     return *CharAddr(str, index);
   }
 
-  static void* GetPeer(const String& str) {
-    return raw_ptr(str)->external_data_->peer();
-  }
+  static void* GetPeer(const String& str) { return raw_ptr(str)->peer_; }
 
   static intptr_t external_data_offset() {
     return OFFSET_OF(RawExternalOneByteString, external_data_);
@@ -7735,11 +7635,13 @@
     return String::RoundedAllocationSize(sizeof(RawExternalOneByteString));
   }
 
-  static RawExternalOneByteString* New(const uint8_t* characters,
-                                       intptr_t len,
-                                       void* peer,
-                                       Dart_PeerFinalizer callback,
-                                       Heap::Space space);
+  static RawExternalOneByteString* New(
+      const uint8_t* characters,
+      intptr_t len,
+      void* peer,
+      intptr_t external_allocation_size,
+      Dart_WeakPersistentHandleFinalizer callback,
+      Heap::Space space);
 
   static RawExternalOneByteString* null() {
     return reinterpret_cast<RawExternalOneByteString*>(Object::null());
@@ -7763,20 +7665,22 @@
   static const uint8_t* CharAddr(const String& str, intptr_t index) {
     ASSERT((index >= 0) && (index < str.Length()));
     ASSERT(str.IsExternalOneByteString());
-    return &(raw_ptr(str)->external_data_->data()[index]);
+    return &(raw_ptr(str)->external_data_[index]);
   }
 
   static const uint8_t* DataStart(const String& str) {
     ASSERT(str.IsExternalOneByteString());
-    return &(raw_ptr(str)->external_data_->data()[0]);
+    return raw_ptr(str)->external_data_;
   }
 
   static void SetExternalData(const String& str,
-                              ExternalStringData<uint8_t>* data) {
+                              const uint8_t* data,
+                              void* peer) {
     ASSERT(str.IsExternalOneByteString());
-    ASSERT(!Isolate::Current()->heap()->Contains(
-        reinterpret_cast<uword>(data->data())));
+    ASSERT(
+        !Isolate::Current()->heap()->Contains(reinterpret_cast<uword>(data)));
     str.StoreNonPointer(&raw_ptr(str)->external_data_, data);
+    str.StoreNonPointer(&raw_ptr(str)->peer_, peer);
   }
 
   static void Finalize(void* isolate_callback_data,
@@ -7808,9 +7712,7 @@
     return *CharAddr(str, index);
   }
 
-  static void* GetPeer(const String& str) {
-    return raw_ptr(str)->external_data_->peer();
-  }
+  static void* GetPeer(const String& str) { return raw_ptr(str)->peer_; }
 
   static intptr_t external_data_offset() {
     return OFFSET_OF(RawExternalTwoByteString, external_data_);
@@ -7824,11 +7726,13 @@
     return String::RoundedAllocationSize(sizeof(RawExternalTwoByteString));
   }
 
-  static RawExternalTwoByteString* New(const uint16_t* characters,
-                                       intptr_t len,
-                                       void* peer,
-                                       Dart_PeerFinalizer callback,
-                                       Heap::Space space = Heap::kNew);
+  static RawExternalTwoByteString* New(
+      const uint16_t* characters,
+      intptr_t len,
+      void* peer,
+      intptr_t external_allocation_size,
+      Dart_WeakPersistentHandleFinalizer callback,
+      Heap::Space space = Heap::kNew);
 
   static RawExternalTwoByteString* null() {
     return reinterpret_cast<RawExternalTwoByteString*>(Object::null());
@@ -7848,20 +7752,22 @@
   static const uint16_t* CharAddr(const String& str, intptr_t index) {
     ASSERT((index >= 0) && (index < str.Length()));
     ASSERT(str.IsExternalTwoByteString());
-    return &(raw_ptr(str)->external_data_->data()[index]);
+    return &(raw_ptr(str)->external_data_[index]);
   }
 
   static const uint16_t* DataStart(const String& str) {
     ASSERT(str.IsExternalTwoByteString());
-    return &(raw_ptr(str)->external_data_->data()[0]);
+    return raw_ptr(str)->external_data_;
   }
 
   static void SetExternalData(const String& str,
-                              ExternalStringData<uint16_t>* data) {
+                              const uint16_t* data,
+                              void* peer) {
     ASSERT(str.IsExternalTwoByteString());
-    ASSERT(!Isolate::Current()->heap()->Contains(
-        reinterpret_cast<uword>(data->data())));
+    ASSERT(
+        !Isolate::Current()->heap()->Contains(reinterpret_cast<uword>(data)));
     str.StoreNonPointer(&raw_ptr(str)->external_data_, data);
+    str.StoreNonPointer(&raw_ptr(str)->peer_, peer);
   }
 
   static void Finalize(void* isolate_callback_data,
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index aa21aa8..89661ef 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -1179,10 +1179,6 @@
   jsobj.AddProperty("valueAsString", ToCString());
 }
 
-void Bigint::PrintJSONImpl(JSONStream* stream, bool ref) const {
-  Integer::PrintJSONImpl(stream, ref);
-}
-
 void String::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   if (raw() == Symbols::OptimizedOut().raw()) {
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 5c9e90f..74f3dfb 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -46,7 +46,6 @@
   RW(Type, smi_type)                                                           \
   RW(Class, mint_class)                                                        \
   RW(Type, mint_type)                                                          \
-  RW(Class, bigint_class)                                                      \
   RW(Class, double_class)                                                      \
   RW(Type, double_type)                                                        \
   RW(Type, float32x4_type)                                                     \
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 0fc1385..ed8d624 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -338,17 +338,6 @@
   EXPECT_EQ(1, a.CompareWith(mint2));
   EXPECT_EQ(-1, c.CompareWith(mint1));
   EXPECT_EQ(1, c.CompareWith(mint2));
-
-  if (!Bigint::IsDisabled()) {
-    Bigint& big1 =
-        Bigint::Handle(Bigint::NewFromCString("10000000000000000000"));
-    Bigint& big2 =
-        Bigint::Handle(Bigint::NewFromCString("-10000000000000000000"));
-    EXPECT_EQ(-1, a.CompareWith(big1));
-    EXPECT_EQ(1, a.CompareWith(big2));
-    EXPECT_EQ(-1, c.CompareWith(big1));
-    EXPECT_EQ(1, c.CompareWith(big2));
-  }
 }
 
 ISOLATE_UNIT_TEST_CASE(StringCompareTo) {
@@ -497,17 +486,6 @@
   EXPECT_EQ(-1, c.CompareWith(smi1));
   EXPECT_EQ(-1, c.CompareWith(smi2));
 
-  if (!Bigint::IsDisabled()) {
-    Bigint& big1 =
-        Bigint::Handle(Bigint::NewFromCString("10000000000000000000"));
-    Bigint& big2 =
-        Bigint::Handle(Bigint::NewFromCString("-10000000000000000000"));
-    EXPECT_EQ(-1, a.CompareWith(big1));
-    EXPECT_EQ(1, a.CompareWith(big2));
-    EXPECT_EQ(-1, c.CompareWith(big1));
-    EXPECT_EQ(1, c.CompareWith(big2));
-  }
-
   int64_t mint_value = DART_2PART_UINT64_C(0x7FFFFFFF, 64);
   const String& mint_string = String::Handle(String::New("0x7FFFFFFF00000064"));
   Mint& mint1 = Mint::Handle();
@@ -603,48 +581,6 @@
   }
 }
 
-ISOLATE_UNIT_TEST_CASE(Bigint) {
-  if (Bigint::IsDisabled()) {
-    return;
-  }
-
-  Bigint& b = Bigint::Handle();
-  EXPECT(b.IsNull());
-  const char* cstr = "18446744073709551615000";
-  const String& test = String::Handle(String::New(cstr));
-  b ^= Integer::NewCanonical(test);
-  const char* str = b.ToCString();
-  EXPECT_STREQ(cstr, str);
-
-  int64_t t64 = DART_2PART_UINT64_C(1, 0);
-  Bigint& big = Bigint::Handle(Bigint::NewFromInt64(t64));
-  EXPECT_EQ(t64, big.AsInt64Value());
-  big = Bigint::NewFromCString("10000000000000000000");
-  EXPECT_EQ(1e19, big.AsDoubleValue());
-
-  Bigint& big1 =
-      Bigint::Handle(Bigint::NewFromCString("100000000000000000000"));
-  Bigint& big2 =
-      Bigint::Handle(Bigint::NewFromCString("100000000000000000010"));
-  Bigint& big3 =
-      Bigint::Handle(Bigint::NewFromCString("-10000000000000000000"));
-
-  EXPECT_EQ(0, big1.CompareWith(big1));
-  EXPECT_EQ(-1, big1.CompareWith(big2));
-  EXPECT_EQ(1, big2.CompareWith(big1));
-  EXPECT_EQ(1, big1.CompareWith(big3));
-  EXPECT_EQ(-1, big3.CompareWith(big1));
-
-  Smi& smi1 = Smi::Handle(Smi::New(5));
-  Smi& smi2 = Smi::Handle(Smi::New(-2));
-
-  EXPECT_EQ(-1, smi1.CompareWith(big1));
-  EXPECT_EQ(-1, smi2.CompareWith(big1));
-
-  EXPECT_EQ(1, smi1.CompareWith(big3));
-  EXPECT_EQ(1, smi2.CompareWith(big3));
-}
-
 ISOLATE_UNIT_TEST_CASE(Integer) {
   Integer& i = Integer::Handle();
   i = Integer::NewCanonical(String::Handle(String::New("12")));
@@ -655,10 +591,10 @@
   EXPECT(i.IsSmi());
   i = Integer::NewCanonical(
       String::Handle(String::New("12345678901234567890")));
-  EXPECT(FLAG_limit_ints_to_64_bits ? i.IsNull() : i.IsBigint());
+  EXPECT(i.IsNull());
   i = Integer::NewCanonical(
       String::Handle(String::New("-12345678901234567890111222")));
-  EXPECT(FLAG_limit_ints_to_64_bits ? i.IsNull() : i.IsBigint());
+  EXPECT(i.IsNull());
 }
 
 ISOLATE_UNIT_TEST_CASE(String) {
@@ -1630,12 +1566,16 @@
   EXPECT(!th_str.Equals(chars, 3));
 }
 
+static void NoopFinalizer(void* isolate_callback_data,
+                          Dart_WeakPersistentHandle handle,
+                          void* peer) {}
+
 ISOLATE_UNIT_TEST_CASE(ExternalOneByteString) {
   uint8_t characters[] = {0xF6, 0xF1, 0xE9};
   intptr_t len = ARRAY_SIZE(characters);
 
-  const String& str = String::Handle(
-      ExternalOneByteString::New(characters, len, NULL, NULL, Heap::kNew));
+  const String& str = String::Handle(ExternalOneByteString::New(
+      characters, len, NULL, 0, NoopFinalizer, Heap::kNew));
   EXPECT(!str.IsOneByteString());
   EXPECT(str.IsExternalOneByteString());
   EXPECT_EQ(str.Length(), len);
@@ -1684,8 +1624,8 @@
                           '\v', '\r', '\\', '$',  'z'};
   intptr_t len = ARRAY_SIZE(characters);
 
-  const String& str = String::Handle(
-      ExternalOneByteString::New(characters, len, NULL, NULL, Heap::kNew));
+  const String& str = String::Handle(ExternalOneByteString::New(
+      characters, len, NULL, 0, NoopFinalizer, Heap::kNew));
   EXPECT(!str.IsOneByteString());
   EXPECT(str.IsExternalOneByteString());
   EXPECT_EQ(str.Length(), len);
@@ -1694,8 +1634,8 @@
       String::Handle(String::EscapeSpecialCharacters(str));
   EXPECT(escaped_str.Equals("a\\n\\f\\b\\t\\v\\r\\\\\\$z"));
 
-  const String& empty_str = String::Handle(
-      ExternalOneByteString::New(characters, 0, NULL, NULL, Heap::kNew));
+  const String& empty_str = String::Handle(ExternalOneByteString::New(
+      characters, 0, NULL, 0, NoopFinalizer, Heap::kNew));
   const String& escaped_empty_str =
       String::Handle(String::EscapeSpecialCharacters(empty_str));
   EXPECT_EQ(empty_str.Length(), 0);
@@ -1729,8 +1669,8 @@
                            '\v', '\r', '\\', '$',  'z'};
   intptr_t len = ARRAY_SIZE(characters);
 
-  const String& str = String::Handle(
-      ExternalTwoByteString::New(characters, len, NULL, NULL, Heap::kNew));
+  const String& str = String::Handle(ExternalTwoByteString::New(
+      characters, len, NULL, 0, NoopFinalizer, Heap::kNew));
   EXPECT(str.IsExternalTwoByteString());
   EXPECT_EQ(str.Length(), len);
   EXPECT(str.Equals("a\n\f\b\t\v\r\\$z"));
@@ -1738,8 +1678,8 @@
       String::Handle(String::EscapeSpecialCharacters(str));
   EXPECT(escaped_str.Equals("a\\n\\f\\b\\t\\v\\r\\\\\\$z"));
 
-  const String& empty_str = String::Handle(
-      ExternalTwoByteString::New(characters, 0, NULL, NULL, Heap::kNew));
+  const String& empty_str = String::Handle(ExternalTwoByteString::New(
+      characters, 0, NULL, 0, NoopFinalizer, Heap::kNew));
   const String& escaped_empty_str =
       String::Handle(String::EscapeSpecialCharacters(empty_str));
   EXPECT_EQ(empty_str.Length(), 0);
@@ -1750,8 +1690,8 @@
   uint16_t characters[] = {0x1E6B, 0x1E85, 0x1E53};
   intptr_t len = ARRAY_SIZE(characters);
 
-  const String& str = String::Handle(
-      ExternalTwoByteString::New(characters, len, NULL, NULL, Heap::kNew));
+  const String& str = String::Handle(ExternalTwoByteString::New(
+      characters, len, NULL, 0, NoopFinalizer, Heap::kNew));
   EXPECT(!str.IsTwoByteString());
   EXPECT(str.IsExternalTwoByteString());
   EXPECT_EQ(str.Length(), len);
@@ -2537,16 +2477,17 @@
   EXPECT_EQ(4, local_scope->num_variables());         // ta, a, b, c.
   EXPECT_EQ(3, local_scope->NumCapturedVariables());  // ta, a, c.
 
-  const int first_parameter_index = 0;
+  const VariableIndex first_parameter_index(0);
   const int num_parameters = 0;
-  const int first_frame_index = -1;
+  const VariableIndex first_local_index(-1);
   bool found_captured_vars = false;
-  int next_frame_index = parent_scope->AllocateVariables(
-      first_parameter_index, num_parameters, first_frame_index, NULL,
+  VariableIndex next_index = parent_scope->AllocateVariables(
+      first_parameter_index, num_parameters, first_local_index, NULL,
       &found_captured_vars);
   // Variables a, c and var_ta are captured, therefore are not allocated in
   // frame.
-  EXPECT_EQ(0, next_frame_index - first_frame_index);  // Indices in frame < 0.
+  EXPECT_EQ(0, next_index.value() -
+                   first_local_index.value());  // Indices in frame < 0.
   const intptr_t parent_scope_context_level = 1;
   EXPECT_EQ(parent_scope_context_level, parent_scope->context_level());
   EXPECT(found_captured_vars);
@@ -2559,13 +2500,13 @@
 
   var_ta = outer_scope->LocalLookupVariable(ta);
   EXPECT(var_ta->is_captured());
-  EXPECT_EQ(0, var_ta->index());  // First index.
+  EXPECT_EQ(0, var_ta->index().value());  // First index.
   EXPECT_EQ(parent_scope_context_level - local_scope_context_level,
             var_ta->owner()->context_level());  // Adjusted context level.
 
   var_a = outer_scope->LocalLookupVariable(a);
   EXPECT(var_a->is_captured());
-  EXPECT_EQ(1, var_a->index());  // First index.
+  EXPECT_EQ(1, var_a->index().value());  // First index.
   EXPECT_EQ(parent_scope_context_level - local_scope_context_level,
             var_a->owner()->context_level());  // Adjusted context level.
 
@@ -2574,7 +2515,7 @@
 
   var_c = outer_scope->LocalLookupVariable(c);
   EXPECT(var_c->is_captured());
-  EXPECT_EQ(2, var_c->index());
+  EXPECT_EQ(2, var_c->index().value());
   EXPECT_EQ(parent_scope_context_level - local_scope_context_level,
             var_c->owner()->context_level());  // Adjusted context level.
 }
@@ -3219,15 +3160,15 @@
   mangled_name = OneByteString::New("foo@12345.name@12345");
   ext_mangled_name = ExternalOneByteString::New(
       reinterpret_cast<const uint8_t*>(ext_mangled_str),
-      strlen(ext_mangled_str), NULL, NULL, Heap::kNew);
+      strlen(ext_mangled_str), NULL, 0, NoopFinalizer, Heap::kNew);
   EXPECT(ext_mangled_name.IsExternalOneByteString());
-  ext_bare_name =
-      ExternalOneByteString::New(reinterpret_cast<const uint8_t*>(ext_bare_str),
-                                 strlen(ext_bare_str), NULL, NULL, Heap::kNew);
+  ext_bare_name = ExternalOneByteString::New(
+      reinterpret_cast<const uint8_t*>(ext_bare_str), strlen(ext_bare_str),
+      NULL, 0, NoopFinalizer, Heap::kNew);
   EXPECT(ext_bare_name.IsExternalOneByteString());
   ext_bad_bare_name = ExternalOneByteString::New(
       reinterpret_cast<const uint8_t*>(ext_bad_bare_str),
-      strlen(ext_bad_bare_str), NULL, NULL, Heap::kNew);
+      strlen(ext_bad_bare_str), NULL, 0, NoopFinalizer, Heap::kNew);
   EXPECT(ext_bad_bare_name.IsExternalOneByteString());
 
   // str1 - OneByteString, str2 - ExternalOneByteString.
@@ -4186,25 +4127,6 @@
         "\"id\":\"\",\"valueAsString\":\"-9223372036854775808\"}",
         buffer);
   }
-  // Bigint reference
-  if (!Bigint::IsDisabled()) {
-    JSONStream js;
-    const String& bigint_str =
-        String::Handle(String::New("44444444444444444444444444444444"));
-    const Integer& bigint = Integer::Handle(Integer::New(bigint_str));
-    bigint.PrintJSON(&js, true);
-    ElideJSONSubstring("classes", js.ToCString(), buffer);
-    ElideJSONSubstring("objects", buffer, buffer);
-    ElideJSONSubstring("_Bigint@", buffer, buffer);
-    EXPECT_STREQ(
-        "{\"type\":\"@Instance\","
-        "\"_vmType\":\"Bigint\","
-        "\"class\":{\"type\":\"@Class\",\"fixedId\":true,\"id\":\"\","
-        "\"name\":\"_Bigint\",\"_vmName\":\"\"},"
-        "\"kind\":\"Int\","
-        "\"id\":\"\",\"valueAsString\":\"44444444444444444444444444444444\"}",
-        buffer);
-  }
   // Double reference
   {
     JSONStream js;
@@ -4576,8 +4498,8 @@
     uint8_t characters[] = {0xF6, 0xF1, 0xE9};
     intptr_t len = ARRAY_SIZE(characters);
 
-    const String& str = String::Handle(
-        ExternalOneByteString::New(characters, len, NULL, NULL, Heap::kNew));
+    const String& str = String::Handle(ExternalOneByteString::New(
+        characters, len, NULL, 0, NoopFinalizer, Heap::kNew));
     const String* data[3] = {&str, &Symbols::Dot(), &str};
     CheckConcatAll(data, 3);
   }
@@ -4587,8 +4509,8 @@
                              '\v', '\r', '\\', '$',  'z'};
     intptr_t len = ARRAY_SIZE(characters);
 
-    const String& str = String::Handle(
-        ExternalTwoByteString::New(characters, len, NULL, NULL, Heap::kNew));
+    const String& str = String::Handle(ExternalTwoByteString::New(
+        characters, len, NULL, 0, NoopFinalizer, Heap::kNew));
     const String* data[3] = {&str, &Symbols::Dot(), &str};
     CheckConcatAll(data, 3);
   }
@@ -4597,15 +4519,15 @@
     uint8_t characters1[] = {0xF6, 0xF1, 0xE9};
     intptr_t len1 = ARRAY_SIZE(characters1);
 
-    const String& str1 = String::Handle(
-        ExternalOneByteString::New(characters1, len1, NULL, NULL, Heap::kNew));
+    const String& str1 = String::Handle(ExternalOneByteString::New(
+        characters1, len1, NULL, 0, NoopFinalizer, Heap::kNew));
 
     uint16_t characters2[] = {'a',  '\n', '\f', '\b', '\t',
                               '\v', '\r', '\\', '$',  'z'};
     intptr_t len2 = ARRAY_SIZE(characters2);
 
-    const String& str2 = String::Handle(
-        ExternalTwoByteString::New(characters2, len2, NULL, NULL, Heap::kNew));
+    const String& str2 = String::Handle(ExternalTwoByteString::New(
+        characters2, len2, NULL, 0, NoopFinalizer, Heap::kNew));
     const String* data[3] = {&str1, &Symbols::Dot(), &str2};
     CheckConcatAll(data, 3);
   }
diff --git a/runtime/vm/os_android.cc b/runtime/vm/os_android.cc
index 4481f19..a8ec5a9 100644
--- a/runtime/vm/os_android.cc
+++ b/runtime/vm/os_android.cc
@@ -329,7 +329,7 @@
     base = 16;
   }
   errno = 0;
-  if (FLAG_limit_ints_to_64_bits && (base == 16)) {
+  if (base == 16) {
     // Unsigned 64-bit hexadecimal integer literals are allowed but
     // immediately interpreted as signed 64-bit integers.
     *value = static_cast<int64_t>(strtoull(str, &endptr, base));
diff --git a/runtime/vm/os_fuchsia.cc b/runtime/vm/os_fuchsia.cc
index 6284307..605e2dd 100644
--- a/runtime/vm/os_fuchsia.cc
+++ b/runtime/vm/os_fuchsia.cc
@@ -8,7 +8,7 @@
 #include "vm/os.h"
 
 #include <errno.h>
-#include <fdio/util.h>
+#include <lib/fdio/util.h>
 #include <zircon/process.h>
 #include <zircon/syscalls.h>
 #include <zircon/syscalls/object.h>
@@ -221,7 +221,7 @@
     base = 16;
   }
   errno = 0;
-  if (FLAG_limit_ints_to_64_bits && (base == 16)) {
+  if (base == 16) {
     // Unsigned 64-bit hexadecimal integer literals are allowed but
     // immediately interpreted as signed 64-bit integers.
     *value = static_cast<int64_t>(strtoull(str, &endptr, base));
diff --git a/runtime/vm/os_linux.cc b/runtime/vm/os_linux.cc
index a73de36..8a9c69e 100644
--- a/runtime/vm/os_linux.cc
+++ b/runtime/vm/os_linux.cc
@@ -523,7 +523,7 @@
     base = 16;
   }
   errno = 0;
-  if (FLAG_limit_ints_to_64_bits && (base == 16)) {
+  if (base == 16) {
     // Unsigned 64-bit hexadecimal integer literals are allowed but
     // immediately interpreted as signed 64-bit integers.
     *value = static_cast<int64_t>(strtoull(str, &endptr, base));
diff --git a/runtime/vm/os_macos.cc b/runtime/vm/os_macos.cc
index 8c5e2c9..e423c7a 100644
--- a/runtime/vm/os_macos.cc
+++ b/runtime/vm/os_macos.cc
@@ -276,7 +276,7 @@
     base = 16;
   }
   errno = 0;
-  if (FLAG_limit_ints_to_64_bits && (base == 16)) {
+  if (base == 16) {
     // Unsigned 64-bit hexadecimal integer literals are allowed but
     // immediately interpreted as signed 64-bit integers.
     *value = static_cast<int64_t>(strtoull(str, &endptr, base));
diff --git a/runtime/vm/os_win.cc b/runtime/vm/os_win.cc
index d8a0a9a..c9a102b 100644
--- a/runtime/vm/os_win.cc
+++ b/runtime/vm/os_win.cc
@@ -293,7 +293,7 @@
     base = 16;
   }
   errno = 0;
-  if (FLAG_limit_ints_to_64_bits && (base == 16)) {
+  if (base == 16) {
     // Unsigned 64-bit hexadecimal integer literals are allowed but
     // immediately interpreted as signed 64-bit integers.
     *value = static_cast<int64_t>(_strtoui64(str, &endptr, base));
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index df7e04a..2beff46 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -12,6 +12,7 @@
 #include "vm/gc_marker.h"
 #include "vm/gc_sweeper.h"
 #include "vm/lockers.h"
+#include "vm/log.h"
 #include "vm/object.h"
 #include "vm/object_set.h"
 #include "vm/os_thread.h"
@@ -165,9 +166,7 @@
 // based on the device's actual speed.
 static const intptr_t kConservativeInitialMarkSpeed = 20;
 
-PageSpace::PageSpace(Heap* heap,
-                     intptr_t max_capacity_in_words,
-                     intptr_t max_external_in_words)
+PageSpace::PageSpace(Heap* heap, intptr_t max_capacity_in_words)
     : freelist_(),
       heap_(heap),
       pages_lock_(new Mutex()),
@@ -180,7 +179,6 @@
       bump_top_(0),
       bump_end_(0),
       max_capacity_in_words_(max_capacity_in_words),
-      max_external_in_words_(max_external_in_words),
       tasks_lock_(new Monitor()),
       tasks_(0),
 #if defined(DEBUG)
@@ -445,7 +443,6 @@
   AtomicOperations::IncrementBy(&(usage_.external_in_words), size_in_words);
   NOT_IN_PRODUCT(
       heap_->isolate()->class_table()->UpdateAllocatedExternalOld(cid, size));
-  // TODO(koda): Control growth.
 }
 
 void PageSpace::FreeExternal(intptr_t size) {
@@ -1233,13 +1230,19 @@
                                          int garbage_collection_time_ratio)
     : heap_(heap),
       is_enabled_(false),
-      grow_heap_(heap_growth_max / 2),
       heap_growth_ratio_(heap_growth_ratio),
       desired_utilization_((100.0 - heap_growth_ratio) / 100.0),
       heap_growth_max_(heap_growth_max),
       garbage_collection_time_ratio_(garbage_collection_time_ratio),
       last_code_collection_in_us_(OS::GetCurrentMonotonicMicros()),
-      idle_gc_threshold_in_words_(0) {}
+      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);
+  intptr_t grow_external = heap_growth_max / 2;
+  gc_external_threshold_in_words_ =
+      last_usage_.external_in_words + (kPageSizeInWords * grow_external);
+}
 
 PageSpaceController::~PageSpaceController() {}
 
@@ -1250,22 +1253,12 @@
   if (heap_growth_ratio_ == 100) {
     return false;
   }
-  intptr_t capacity_increase_in_words =
-      after.capacity_in_words - last_usage_.capacity_in_words;
-  // The concurrent sweeper might have freed more capacity than was allocated.
-  capacity_increase_in_words =
-      Utils::Maximum<intptr_t>(0, capacity_increase_in_words);
-  capacity_increase_in_words =
-      Utils::RoundUp(capacity_increase_in_words, kPageSizeInWords);
-  intptr_t capacity_increase_in_pages =
-      capacity_increase_in_words / kPageSizeInWords;
-  bool needs_gc = capacity_increase_in_pages > grow_heap_;
-  if (FLAG_log_growth) {
-    OS::PrintErr("%s: allocate %s %" Pd " %s %" Pd "\n",
-                 heap_->isolate()->name(), needs_gc ? "collect" : "grow",
-                 capacity_increase_in_pages, needs_gc ? ">" : "<=", grow_heap_);
-  }
-  return needs_gc;
+  return (after.capacity_in_words > gc_threshold_in_words_) ||
+         NeedsExternalCollection(after);
+}
+
+bool PageSpaceController::NeedsExternalCollection(SpaceUsage after) const {
+  return after.external_in_words > gc_external_threshold_in_words_;
 }
 
 bool PageSpaceController::NeedsIdleGarbageCollection(SpaceUsage current) const {
@@ -1275,13 +1268,7 @@
   if (heap_growth_ratio_ == 100) {
     return false;
   }
-  bool needs_gc = current.used_in_words > idle_gc_threshold_in_words_;
-  if (FLAG_log_growth) {
-    OS::PrintErr("%s: idle %s %" Pd " %s %" Pd "\n", heap_->isolate()->name(),
-                 needs_gc ? "collect" : "grow", current.used_in_words,
-                 needs_gc ? ">" : "<=", idle_gc_threshold_in_words_);
-  }
-  return needs_gc;
+  return current.capacity_in_words > idle_gc_threshold_in_words_;
 }
 
 void PageSpaceController::EvaluateGarbageCollection(SpaceUsage before,
@@ -1293,10 +1280,32 @@
   const int gc_time_fraction = history_.GarbageCollectionTimeFraction();
   heap_->RecordData(PageSpace::kGCTimeFraction, gc_time_fraction);
 
+  // Decide how much external allocations can grow before triggering a GC.
+  {
+    const intptr_t external_after_in_pages =
+        Utils::RoundUp(after.external_in_words, kPageSizeInWords) /
+        kPageSizeInWords;
+    const intptr_t external_growth_in_pages =
+        Utils::RoundUp(before.external_in_words - last_usage_.external_in_words,
+                       kPageSizeInWords) /
+        kPageSizeInWords;
+    // Trigger GC when external allocations grow:
+    // - 25% of the external allocations after this GC, or
+    // - half of the growth since the last collection
+    // whichever is bigger. The second case prevents shrinking the limit too
+    // much. See similar handling of the Dart heap below.
+    intptr_t grow_external = Utils::Maximum<intptr_t>(
+        external_after_in_pages >> 2, external_growth_in_pages >> 1);
+
+    gc_external_threshold_in_words_ =
+        after.external_in_words + (kPageSizeInWords * grow_external);
+  }
+
   // Assume garbage increases linearly with allocation:
   // G = kA, and estimate k from the previous cycle.
   const intptr_t allocated_since_previous_gc =
       before.used_in_words - last_usage_.used_in_words;
+  intptr_t grow_heap;
   if (allocated_since_previous_gc > 0) {
     const intptr_t garbage = before.used_in_words - after.used_in_words;
     ASSERT(garbage >= 0);
@@ -1323,13 +1332,13 @@
         kPageSizeInWords;
     if (garbage_ratio == 0) {
       // No garbage in the previous cycle so it would be hard to compute a
-      // grow_heap_ size based on estimated garbage so we use growth ratio
+      // grow_heap size based on estimated garbage so we use growth ratio
       // heuristics instead.
-      grow_heap_ =
+      grow_heap =
           Utils::Maximum(static_cast<intptr_t>(heap_growth_max_), grow_pages);
     } else {
-      // Find minimum 'grow_heap_' such that after increasing capacity by
-      // 'grow_heap_' pages and filling them, we expect a GC to be worthwhile.
+      // Find minimum 'grow_heap' such that after increasing capacity by
+      // 'grow_heap' pages and filling them, we expect a GC to be worthwhile.
       intptr_t max = heap_growth_max_;
       intptr_t min = 0;
       intptr_t local_grow_heap = 0;
@@ -1346,33 +1355,43 @@
         }
       }
       local_grow_heap = (max + min) / 2;
-      grow_heap_ = local_grow_heap;
-      ASSERT(grow_heap_ >= 0);
+      grow_heap = local_grow_heap;
+      ASSERT(grow_heap >= 0);
       // If we are going to grow by heap_grow_max_ then ensure that we
       // will be growing the heap at least by the growth ratio heuristics.
-      if (grow_heap_ >= heap_growth_max_) {
-        grow_heap_ = Utils::Maximum(grow_pages, grow_heap_);
+      if (grow_heap >= heap_growth_max_) {
+        grow_heap = Utils::Maximum(grow_pages, grow_heap);
       }
     }
   } else {
     heap_->RecordData(PageSpace::kGarbageRatio, 100);
-    grow_heap_ = 0;
+    grow_heap = 0;
   }
-  heap_->RecordData(PageSpace::kPageGrowth, grow_heap_);
+  heap_->RecordData(PageSpace::kPageGrowth, grow_heap);
 
   // Limit shrinkage: allow growth by at least half the pages freed by GC.
   const intptr_t freed_pages =
       (before.capacity_in_words - after.capacity_in_words) / kPageSizeInWords;
-  grow_heap_ = Utils::Maximum(grow_heap_, freed_pages / 2);
-  heap_->RecordData(PageSpace::kAllowedGrowth, grow_heap_);
+  grow_heap = Utils::Maximum(grow_heap, freed_pages / 2);
+  heap_->RecordData(PageSpace::kAllowedGrowth, grow_heap);
   last_usage_ = after;
 
-  // Set the idle threshold halfway between the current size and the capacity
-  // at which we'd block for a GC.
-  intptr_t gc_threshold_in_words =
-      after.capacity_in_words + (kPageSizeInWords * grow_heap_);
+  // Save final threshold compared before growing.
+  gc_threshold_in_words_ =
+      after.capacity_in_words + (kPageSizeInWords * grow_heap);
+
+  // Set the idle threshold halfway between the current capacity and the
+  // capacity at which we'd block for a GC.
   idle_gc_threshold_in_words_ =
-      (after.used_in_words + gc_threshold_in_words) / 2;
+      (after.capacity_in_words + gc_threshold_in_words_) / 2;
+
+  if (FLAG_log_growth) {
+    THR_Print("%s: threshold=%" Pd "kB, idle_threshold=%" Pd
+              "kB, external_threshold=%" Pd "kB\n",
+              heap_->isolate()->name(), gc_threshold_in_words_ / KBInWords,
+              idle_gc_threshold_in_words_ / KBInWords,
+              gc_external_threshold_in_words_ / KBInWords);
+  }
 }
 
 void PageSpaceGarbageCollectionHistory::AddGarbageCollectionTime(int64_t start,
diff --git a/runtime/vm/pages.h b/runtime/vm/pages.h
index 06fbf27..b0dfc7a 100644
--- a/runtime/vm/pages.h
+++ b/runtime/vm/pages.h
@@ -151,6 +151,8 @@
   // (e.g., promotion), as it does not change the state of the controller.
   bool NeedsGarbageCollection(SpaceUsage after) const;
 
+  bool NeedsExternalCollection(SpaceUsage after) const;
+
   // Returns whether an idle GC is worthwhile.
   bool NeedsIdleGarbageCollection(SpaceUsage current) const;
 
@@ -179,29 +181,32 @@
   // Usage after last evaluated GC or last enabled.
   SpaceUsage last_usage_;
 
-  // Pages of capacity growth allowed before next GC is advised.
-  intptr_t grow_heap_;
-
   // If the garbage collector was not able to free more than heap_growth_ratio_
   // memory, then the heap is grown. Otherwise garbage collection is performed.
-  int heap_growth_ratio_;
+  const int heap_growth_ratio_;
 
   // The desired percent of heap in-use after a garbage collection.
   // Equivalent to \frac{100-heap_growth_ratio_}{100}.
-  double desired_utilization_;
+  const double desired_utilization_;
 
   // Max number of pages we grow.
-  int heap_growth_max_;
+  const int heap_growth_max_;
 
   // If the relative GC time goes above garbage_collection_time_ratio_ %,
   // we grow the heap more aggressively.
-  int garbage_collection_time_ratio_;
+  const int garbage_collection_time_ratio_;
 
   // The time in microseconds of the last time we tried to collect unused
   // code.
   int64_t last_code_collection_in_us_;
 
-  // We start considering idle mark-sweeps when old space crosses this size.
+  // Perform a synchronous GC when capacity exceeds this amount.
+  intptr_t gc_threshold_in_words_;
+
+  // Perform a synchronous GC when external allocations exceed this amount.
+  intptr_t gc_external_threshold_in_words_;
+
+  // Start considering idle GC when capacity exceeds this amount.
   intptr_t idle_gc_threshold_in_words_;
 
   PageSpaceGarbageCollectionHistory history_;
@@ -213,9 +218,7 @@
  public:
   enum GrowthPolicy { kControlGrowth, kForceGrowth };
 
-  PageSpace(Heap* heap,
-            intptr_t max_capacity_in_words,
-            intptr_t max_external_in_words);
+  PageSpace(Heap* heap, intptr_t max_capacity_in_words);
   ~PageSpace();
 
   uword TryAllocate(intptr_t size,
@@ -229,8 +232,7 @@
   }
 
   bool NeedsGarbageCollection() const {
-    return page_space_controller_.NeedsGarbageCollection(usage_) ||
-           NeedsExternalGC();
+    return page_space_controller_.NeedsGarbageCollection(usage_);
   }
 
   int64_t UsedInWords() const { return usage_.used_in_words; }
@@ -294,11 +296,6 @@
 
   bool GrowthControlState() { return page_space_controller_.is_enabled(); }
 
-  bool NeedsExternalGC() const {
-    return (max_external_in_words_ != 0) &&
-           (ExternalInWords() > max_external_in_words_);
-  }
-
   // Note: Code pages are made executable/non-executable when 'read_only' is
   // true/false, respectively.
   void WriteProtect(bool read_only);
@@ -432,7 +429,7 @@
 
   // Various sizes being tracked for this generation.
   intptr_t max_capacity_in_words_;
-  intptr_t max_external_in_words_;
+
   // NOTE: The capacity component of usage_ is updated by the concurrent
   // sweeper. Use (Increase)CapacityInWords(Locked) for thread-safe access.
   SpaceUsage usage_;
diff --git a/runtime/vm/pages_test.cc b/runtime/vm/pages_test.cc
index 82321b3..85a0d30 100644
--- a/runtime/vm/pages_test.cc
+++ b/runtime/vm/pages_test.cc
@@ -9,7 +9,7 @@
 namespace dart {
 
 TEST_CASE(Pages) {
-  PageSpace* space = new PageSpace(NULL, 4 * MBInWords, 8 * MBInWords);
+  PageSpace* space = new PageSpace(NULL, 4 * MBInWords);
   EXPECT(!space->Contains(reinterpret_cast<uword>(&space)));
   uword block = space->TryAllocate(8 * kWordSize);
   EXPECT(block != 0);
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 0226504..80b7358 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -184,7 +184,7 @@
       guarded_fields_(new ZoneGrowableArray<const Field*>()),
       default_parameter_values_(NULL),
       raw_type_arguments_var_(NULL),
-      first_parameter_index_(0),
+      first_parameter_index_(),
       num_stack_locals_(0),
       have_seen_await_expr_(false),
       kernel_scopes_(NULL) {
@@ -320,7 +320,7 @@
   const intptr_t num_opt_params = function().NumOptionalParameters();
   const intptr_t num_params = num_fixed_params + num_opt_params;
 
-  // Before we start allocating frame indices to variables, we'll setup the
+  // Before we start allocating indices to variables, we'll setup the
   // parameters array, which can be used to access the raw parameters (i.e. not
   // the potentially variables which are in the context)
 
@@ -349,8 +349,8 @@
         raw_parameter->set_is_captured_parameter(true);
 
       } else {
-        raw_parameter->set_index(kParamEndSlotFromFp +
-                                 function().NumParameters() - param);
+        raw_parameter->set_index(
+            VariableIndex(function().NumParameters() - param));
       }
     }
     raw_parameters_.Add(raw_parameter);
@@ -375,41 +375,36 @@
 
   // The copy parameters implementation will still write to local variables
   // which we assign indices as with the old CopyParams implementation.
-  intptr_t parameter_frame_index_start;
-  intptr_t reamining_local_variables_start;
+  VariableIndex parameter_index_start;
+  VariableIndex reamining_local_variables_start;
   {
     // Compute start indices to parameters and locals, and the number of
     // parameters to copy.
     if (num_opt_params == 0) {
-      // Parameter i will be at fp[kParamEndSlotFromFp + num_params - i] and
-      // local variable j will be at fp[kFirstLocalSlotFromFp - j].
-      parameter_frame_index_start = first_parameter_index_ =
-          kParamEndSlotFromFp + num_params;
-      reamining_local_variables_start = kFirstLocalSlotFromFp;
+      parameter_index_start = first_parameter_index_ =
+          VariableIndex(num_params);
+      reamining_local_variables_start = VariableIndex(0);
     } else {
-      // Parameter i will be at fp[kFirstLocalSlotFromFp - i] and local variable
-      // j will be at fp[kFirstLocalSlotFromFp - num_params - j].
-      parameter_frame_index_start = first_parameter_index_ =
-          kFirstLocalSlotFromFp;
-      reamining_local_variables_start = first_parameter_index_ - num_params;
+      parameter_index_start = first_parameter_index_ = VariableIndex(0);
+      reamining_local_variables_start = VariableIndex(-num_params);
     }
   }
 
   if (function_type_arguments_ != NULL && num_opt_params > 0) {
-    reamining_local_variables_start--;
+    reamining_local_variables_start =
+        VariableIndex(reamining_local_variables_start.value() - 1);
   }
 
   // Allocate parameters and local variables, either in the local frame or
   // in the context(s).
   bool found_captured_variables = false;
-  int next_free_frame_index = scope->AllocateVariables(
-      parameter_frame_index_start, num_params,
-      parameter_frame_index_start > 0 ? kFirstLocalSlotFromFp
-                                      : kFirstLocalSlotFromFp - num_params,
-      NULL, &found_captured_variables);
+  VariableIndex first_local_index =
+      VariableIndex(parameter_index_start.value() > 0 ? 0 : -num_params);
+  VariableIndex next_free_index = scope->AllocateVariables(
+      parameter_index_start, num_params, first_local_index, NULL,
+      &found_captured_variables);
 
-  // Frame indices are relative to the frame pointer and are decreasing.
-  num_stack_locals_ = -(next_free_frame_index - kFirstLocalSlotFromFp);
+  num_stack_locals_ = -next_free_index.value();
 }
 
 struct CatchParamDesc {
@@ -431,9 +426,7 @@
   ASSERT(num_params == RegExpMacroAssembler::kParamCount);
   // Compute start indices to parameters and locals, and the number of
   // parameters to copy.
-  // Parameter i will be at fp[kParamEndSlotFromFp + num_params - i] and
-  // local variable j will be at fp[kFirstLocalSlotFromFp - j].
-  first_parameter_index_ = kParamEndSlotFromFp + num_params;
+  first_parameter_index_ = VariableIndex(num_params);
 
   // Frame indices are relative to the frame pointer and are decreasing.
   num_stack_locals_ = num_stack_locals;
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index ca45d6c..2a4952e 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -182,7 +182,7 @@
     return guarded_fields_;
   }
 
-  int first_parameter_index() const { return first_parameter_index_; }
+  VariableIndex first_parameter_index() const { return first_parameter_index_; }
   int num_stack_locals() const { return num_stack_locals_; }
 
   void AllocateVariables();
@@ -240,7 +240,7 @@
   LocalVariable* raw_type_arguments_var_;
   ZoneGrowableArray<LocalVariable*> raw_parameters_;
 
-  int first_parameter_index_;
+  VariableIndex first_parameter_index_;
   int num_stack_locals_;
   bool have_seen_await_expr_;
 
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index 7d83c25..13ab5b0 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -561,6 +561,7 @@
       pc_ = reinterpret_cast<uword*>(frame->pc());
       fp_ = reinterpret_cast<uword*>(frame->fp());
       sp_ = reinterpret_cast<uword*>(frame->sp());
+      is_interpreted_frame_ = frame->is_interpreted();
     }
   }
 
@@ -572,7 +573,7 @@
     }
     ASSERT(ValidFramePointer());
     uword return_pc = InitialReturnAddress();
-    if (StubCode::InInvocationStub(return_pc)) {
+    if (StubCode::InInvocationStub(return_pc, is_interpreted_frame_)) {
       // Edge case- we have called out from the Invocation Stub but have not
       // created the stack frame of the callee. Attempt to locate the exit
       // frame before walking the stack.
@@ -597,14 +598,16 @@
     if (!ValidFramePointer()) {
       return false;
     }
-    if (StubCode::InInvocationStub(reinterpret_cast<uword>(pc_))) {
+    if (StubCode::InInvocationStub(reinterpret_cast<uword>(pc_),
+                                   is_interpreted_frame_)) {
       // In invocation stub.
       return NextExit();
     }
     // In regular Dart frame.
     uword* new_pc = CallerPC();
     // Check if we've moved into the invocation stub.
-    if (StubCode::InInvocationStub(reinterpret_cast<uword>(new_pc))) {
+    if (StubCode::InInvocationStub(reinterpret_cast<uword>(new_pc),
+                                   is_interpreted_frame_)) {
       // New PC is inside invocation stub, skip.
       return NextExit();
     }
@@ -691,6 +694,7 @@
   uword* pc_;
   uword* fp_;
   uword* sp_;
+  bool is_interpreted_frame_;
   const uword stack_upper_;
   const uword stack_lower_;
   bool has_exit_frame_;
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 2f92257..31ae26e 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -378,7 +378,6 @@
 REGULAR_VISITOR(LanguageError)
 REGULAR_VISITOR(UnhandledException)
 REGULAR_VISITOR(UnwindError)
-REGULAR_VISITOR(Bigint)
 REGULAR_VISITOR(ExternalOneByteString)
 REGULAR_VISITOR(ExternalTwoByteString)
 COMPRESSED_VISITOR(GrowableObjectArray)
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index f1c80c5..d8b7048 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -68,7 +68,6 @@
   V(Integer)                                                                   \
   V(Smi)                                                                       \
   V(Mint)                                                                      \
-  V(Bigint)                                                                    \
   V(Double)                                                                    \
   V(Bool)                                                                      \
   V(GrowableObjectArray)                                                       \
@@ -677,7 +676,6 @@
   friend class Array;
   friend class Become;  // GetClassId
   friend class CompactorTask;  // GetClassId
-  friend class Bigint;
   friend class ByteBuffer;
   friend class CidRewriteVisitor;
   friend class Closure;
@@ -1969,16 +1967,6 @@
 };
 COMPILE_ASSERT(sizeof(RawMint) == 16);
 
-class RawBigint : public RawInteger {
-  RAW_HEAP_OBJECT_IMPLEMENTATION(Bigint);
-
-  VISIT_FROM(RawObject*, neg_)
-  RawBool* neg_;
-  RawSmi* used_;
-  RawTypedData* digits_;
-  VISIT_TO(RawObject*, digits_)
-};
-
 class RawDouble : public RawNumber {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Double);
   VISIT_NOTHING();
@@ -2039,36 +2027,11 @@
   friend class String;
 };
 
-template <typename T>
-class ExternalStringData {
- public:
-  ExternalStringData(const T* data, void* peer, Dart_PeerFinalizer callback)
-      : data_(data), peer_(peer), callback_(callback) {}
-  ~ExternalStringData() {
-    if (callback_ != NULL) (*callback_)(peer_);
-  }
-
-  const T* data() { return data_; }
-  void* peer() { return peer_; }
-
-  static intptr_t data_offset() {
-    return OFFSET_OF(ExternalStringData<T>, data_);
-  }
-
- private:
-  const T* data_;
-  void* peer_;
-  Dart_PeerFinalizer callback_;
-};
-
 class RawExternalOneByteString : public RawString {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalOneByteString);
 
- public:
-  typedef ExternalStringData<uint8_t> ExternalData;
-
- private:
-  ExternalData* external_data_;
+  const uint8_t* external_data_;
+  void* peer_;
   friend class Api;
   friend class String;
 };
@@ -2076,11 +2039,8 @@
 class RawExternalTwoByteString : public RawString {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalTwoByteString);
 
- public:
-  typedef ExternalStringData<uint16_t> ExternalData;
-
- private:
-  ExternalData* external_data_;
+  const uint16_t* external_data_;
+  void* peer_;
   friend class Api;
   friend class String;
 };
@@ -2382,17 +2342,14 @@
 inline bool RawObject::IsNumberClassId(intptr_t index) {
   // Make sure this function is updated when new Number types are added.
   COMPILE_ASSERT(kIntegerCid == kNumberCid + 1 && kSmiCid == kNumberCid + 2 &&
-                 kMintCid == kNumberCid + 3 && kBigintCid == kNumberCid + 4 &&
-                 kDoubleCid == kNumberCid + 5);
-  return (index >= kNumberCid && index < kBoolCid);
+                 kMintCid == kNumberCid + 3 && kDoubleCid == kNumberCid + 4);
+  return (index >= kNumberCid && index <= kDoubleCid);
 }
 
 inline bool RawObject::IsIntegerClassId(intptr_t index) {
   // Make sure this function is updated when new Integer types are added.
-  COMPILE_ASSERT(kSmiCid == kIntegerCid + 1 && kMintCid == kIntegerCid + 2 &&
-                 kBigintCid == kIntegerCid + 3 &&
-                 kDoubleCid == kIntegerCid + 4);
-  return (index >= kIntegerCid && index < kDoubleCid);
+  COMPILE_ASSERT(kSmiCid == kIntegerCid + 1 && kMintCid == kIntegerCid + 2);
+  return (index >= kIntegerCid && index <= kMintCid);
 }
 
 inline bool RawObject::IsStringClassId(intptr_t index) {
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index e5571e4..fce31ee 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -1942,51 +1942,6 @@
   writer->Write<int64_t>(ptr()->value_);
 }
 
-RawBigint* Bigint::ReadFrom(SnapshotReader* reader,
-                            intptr_t object_id,
-                            intptr_t tags,
-                            Snapshot::Kind kind,
-                            bool as_reference) {
-  ASSERT(reader != NULL);
-
-  // Allocate bigint object.
-  Bigint& obj = Bigint::ZoneHandle(reader->zone(), Bigint::New());
-  reader->AddBackRef(object_id, &obj, kIsDeserialized);
-
-  // Set all the object fields.
-  READ_OBJECT_FIELDS(obj, obj.raw()->from(), obj.raw()->to(), kAsInlinedObject);
-
-  // If it is a canonical constant make it one.
-  // When reading a full snapshot we don't need to canonicalize the object
-  // as it would already be a canonical object.
-  // When reading a script snapshot or a message snapshot we always have
-  // to canonicalize the object.
-  if (RawObject::IsCanonical(tags)) {
-    obj ^= obj.CheckAndCanonicalize(reader->thread(), NULL);
-    ASSERT(!obj.IsNull());
-    ASSERT(obj.IsCanonical());
-  }
-  return obj.raw();
-}
-
-void RawBigint::WriteTo(SnapshotWriter* writer,
-                        intptr_t object_id,
-                        Snapshot::Kind kind,
-                        bool as_reference) {
-  ASSERT(writer != NULL);
-
-  // Write out the serialization header value for this object.
-  writer->WriteInlinedObjectHeader(object_id);
-
-  // Write out the class and tags information.
-  writer->WriteIndexedObject(kBigintCid);
-  writer->WriteTags(writer->GetObjectTags(this));
-
-  // Write out all the object pointer fields.
-  SnapshotWriterVisitor visitor(writer, kAsInlinedObject);
-  visitor.VisitPointers(from(), to());
-}
-
 RawDouble* Double::ReadFrom(SnapshotReader* reader,
                             intptr_t object_id,
                             intptr_t tags,
@@ -2186,7 +2141,7 @@
   // Serialize as a non-external one byte string.
   StringWriteTo(writer, object_id, kind, kOneByteStringCid,
                 writer->GetObjectTags(this), ptr()->length_,
-                ptr()->external_data_->data());
+                ptr()->external_data_);
 }
 
 void RawExternalTwoByteString::WriteTo(SnapshotWriter* writer,
@@ -2196,7 +2151,7 @@
   // Serialize as a non-external two byte string.
   StringWriteTo(writer, object_id, kind, kTwoByteStringCid,
                 writer->GetObjectTags(this), ptr()->length_,
-                ptr()->external_data_->data());
+                ptr()->external_data_);
 }
 
 RawBool* Bool::ReadFrom(SnapshotReader* reader,
diff --git a/runtime/vm/regexp_assembler_ir.cc b/runtime/vm/regexp_assembler_ir.cc
index 777e8b4..64753cb 100644
--- a/runtime/vm/regexp_assembler_ir.cc
+++ b/runtime/vm/regexp_assembler_ir.cc
@@ -148,7 +148,8 @@
 void IRRegExpMacroAssembler::InitializeLocals() {
   // All generated functions are expected to have a current-context variable.
   // This variable is unused in irregexp functions.
-  parsed_function_->current_context_var()->set_index(GetNextLocalIndex());
+  parsed_function_->current_context_var()->set_index(
+      VariableIndex(GetNextLocalIndex()));
 
   // Create local variables and parameters.
   stack_ = Local(Symbols::stack());
@@ -341,8 +342,8 @@
       new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
                             name, Object::dynamic_type());
 
-  intptr_t param_frame_index = kParamEndSlotFromFp + kParamCount - index;
-  local->set_index(param_frame_index);
+  intptr_t param_frame_index = kParamCount - index;
+  local->set_index(VariableIndex(param_frame_index));
 
   return local;
 }
@@ -351,7 +352,7 @@
   LocalVariable* local =
       new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
                             name, Object::dynamic_type());
-  local->set_index(GetNextLocalIndex());
+  local->set_index(VariableIndex(GetNextLocalIndex()));
 
   return local;
 }
@@ -709,7 +710,7 @@
 
 intptr_t IRRegExpMacroAssembler::GetNextLocalIndex() {
   intptr_t id = local_id_.Alloc();
-  return kFirstLocalSlotFromFp - id;
+  return -id;
 }
 
 Value* IRRegExpMacroAssembler::LoadRegister(intptr_t index) {
@@ -1708,24 +1709,18 @@
   // Bind the pattern as the load receiver.
   Value* pattern_val = BindLoadLocal(*string_param_);
   if (RawObject::IsExternalStringClassId(specialization_cid_)) {
-    // The data of an external string is stored through two indirections.
+    // The data of an external string is stored through one indirection.
     intptr_t external_offset = 0;
-    intptr_t data_offset = 0;
     if (specialization_cid_ == kExternalOneByteStringCid) {
       external_offset = ExternalOneByteString::external_data_offset();
-      data_offset = RawExternalOneByteString::ExternalData::data_offset();
     } else if (specialization_cid_ == kExternalTwoByteStringCid) {
       external_offset = ExternalTwoByteString::external_data_offset();
-      data_offset = RawExternalTwoByteString::ExternalData::data_offset();
     } else {
       UNREACHABLE();
     }
-    // This pushes untagged values on the stack which are immediately consumed:
-    // the first value is consumed to obtain the second value which is consumed
+    // This pushes an untagged value on the stack which is immediately consumed
     // by LoadCodeUnitsAtInstr below.
-    Value* external_val =
-        Bind(new (Z) LoadUntaggedInstr(pattern_val, external_offset));
-    pattern_val = Bind(new (Z) LoadUntaggedInstr(external_val, data_offset));
+    pattern_val = Bind(new (Z) LoadUntaggedInstr(pattern_val, external_offset));
   }
 
   // Here pattern_val might be untagged so this must not trigger a GC.
diff --git a/runtime/vm/regexp_test.cc b/runtime/vm/regexp_test.cc
index 7eb55ad..c4646d4 100644
--- a/runtime/vm/regexp_test.cc
+++ b/runtime/vm/regexp_test.cc
@@ -64,11 +64,15 @@
   EXPECT_EQ(3, smi_2.Value());
 }
 
+static void NoopFinalizer(void* isolate_callback_data,
+                          Dart_WeakPersistentHandle handle,
+                          void* peer) {}
+
 TEST_CASE(RegExp_ExternalOneByteString) {
   uint8_t chars[] = {'a', 'b', 'c', 'b', 'a'};
   intptr_t len = ARRAY_SIZE(chars);
-  const String& str = String::Handle(
-      ExternalOneByteString::New(chars, len, NULL, NULL, Heap::kNew));
+  const String& str = String::Handle(ExternalOneByteString::New(
+      chars, len, NULL, 0, NoopFinalizer, Heap::kNew));
 
   const String& pat = String::Handle(String::New("bc"));
   const Array& res = Array::Handle(Match(pat, str));
@@ -88,8 +92,8 @@
 TEST_CASE(RegExp_ExternalTwoByteString) {
   uint16_t chars[] = {'a', 'b', 'c', 'b', 'a'};
   intptr_t len = ARRAY_SIZE(chars);
-  const String& str = String::Handle(
-      ExternalTwoByteString::New(chars, len, NULL, NULL, Heap::kNew));
+  const String& str = String::Handle(ExternalTwoByteString::New(
+      chars, len, NULL, 0, NoopFinalizer, Heap::kNew));
 
   const String& pat = String::Handle(String::New("bc"));
   const Array& res = Array::Handle(Match(pat, str));
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index bc13a5b..ede255c 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -277,7 +277,7 @@
     if (String::EqualsIgnoringPrivateKey(
             name,
             String::Handle(String::New(FLAG_gc_at_instance_allocation)))) {
-      Isolate::Current()->heap()->CollectAllGarbage();
+      Isolate::Current()->heap()->CollectAllGarbage(Heap::kDebugging);
     }
   }
 #endif
@@ -357,9 +357,13 @@
          instantiator_type_arguments.IsInstantiated());
   ASSERT(function_type_arguments.IsNull() ||
          function_type_arguments.IsInstantiated());
+#if !defined(DART_USE_INTERPRETER)
   // Code inlined in the caller should have optimized the case where the
   // instantiator can be reused as type argument vector.
+  // However, it is non-trivial for the bytecode generator to implement this
+  // optimization, so we do not require it when the interpreter is used.
   ASSERT(!type_arguments.IsUninstantiatedIdentity());
+#endif
   if (isolate->type_checks()) {
     Error& bound_error = Error::Handle(zone);
     type_arguments = type_arguments.InstantiateAndCanonicalizeFrom(
@@ -1936,10 +1940,22 @@
   // persist.
   uword stack_overflow_flags = thread->GetAndClearStackOverflowFlags();
 
+  bool interpreter_stack_overflow = false;
+#if defined(DART_USE_INTERPRETER)
+  // Do not allocate an interpreter, if none is allocated yet.
+  Interpreter* interpreter = Isolate::Current()->interpreter();
+  if (interpreter != NULL) {
+    interpreter_stack_overflow =
+        interpreter->get_sp() >= interpreter->stack_limit();
+  }
+#endif
+
   // If an interrupt happens at the same time as a stack overflow, we
   // process the stack overflow now and leave the interrupt for next
   // time.
-  if (IsCalleeFrameOf(thread->saved_stack_limit(), stack_pos)) {
+  // TODO(regis): Warning: IsCalleeFrameOf is overridden in stack_frame_dbc.h.
+  if (interpreter_stack_overflow ||
+      IsCalleeFrameOf(thread->saved_stack_limit(), stack_pos)) {
     // Use the preallocated stack overflow exception to avoid calling
     // into dart code.
     const Instance& exception =
@@ -2430,20 +2446,6 @@
   UNREACHABLE();
 }
 
-DEFINE_LEAF_RUNTIME_ENTRY(intptr_t,
-                          BigintCompare,
-                          2,
-                          RawBigint* left,
-                          RawBigint* right) {
-  Thread* thread = Thread::Current();
-  StackZone zone(thread);
-  HANDLESCOPE(thread);
-  const Bigint& big_left = Bigint::Handle(left);
-  const Bigint& big_right = Bigint::Handle(right);
-  return big_left.CompareWith(big_right);
-}
-END_LEAF_RUNTIME_ENTRY
-
 double DartModulo(double left, double right) {
   double remainder = fmod_ieee(left, right);
   if (remainder == 0.0) {
diff --git a/runtime/vm/runtime_entry_list.h b/runtime/vm/runtime_entry_list.h
index d9c7367..2c5f7f5 100644
--- a/runtime/vm/runtime_entry_list.h
+++ b/runtime/vm/runtime_entry_list.h
@@ -55,7 +55,6 @@
   V(intptr_t, DeoptimizeCopyFrame, uword, uword)                               \
   V(void, DeoptimizeFillFrame, uword)                                          \
   V(void, StoreBufferBlockProcess, Thread*)                                    \
-  V(intptr_t, BigintCompare, RawBigint*, RawBigint*)                           \
   V(double, LibcPow, double, double)                                           \
   V(double, DartModulo, double, double)                                        \
   V(double, LibcFloor, double)                                                 \
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index e38d191..0af2a71 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -178,14 +178,15 @@
       ASSERT(context_level() == (*context_owner)->context_level());
     }
   }
-  variable->set_index((*context_owner)->num_context_variables_++);
+  variable->set_index(
+      VariableIndex((*context_owner)->num_context_variables_++));
 }
 
-int LocalScope::AllocateVariables(int first_parameter_index,
-                                  int num_parameters,
-                                  int first_frame_index,
-                                  LocalScope* context_owner,
-                                  bool* found_captured_variables) {
+VariableIndex LocalScope::AllocateVariables(VariableIndex first_parameter_index,
+                                            int num_parameters,
+                                            VariableIndex first_local_index,
+                                            LocalScope* context_owner,
+                                            bool* found_captured_variables) {
   // We should not allocate variables of nested functions while compiling an
   // enclosing function.
   ASSERT(function_level() == 0);
@@ -193,7 +194,8 @@
   // Parameters must be listed first and must all appear in the top scope.
   ASSERT(num_parameters <= num_variables());
   int pos = 0;                              // Current variable position.
-  int frame_index = first_parameter_index;  // Current free frame index.
+  VariableIndex next_index =
+      first_parameter_index;  // Current free frame index.
   while (pos < num_parameters) {
     LocalVariable* parameter = VariableAt(pos);
     pos++;
@@ -206,16 +208,17 @@
       // A captured parameter has a slot allocated in the frame and one in the
       // context, where it gets copied to. The parameter index reflects the
       // context allocation index.
-      frame_index--;
+      next_index = VariableIndex(next_index.value() - 1);
       AllocateContextVariable(parameter, &context_owner);
       *found_captured_variables = true;
     } else {
-      parameter->set_index(frame_index--);
+      parameter->set_index(next_index);
+      next_index = VariableIndex(next_index.value() - 1);
     }
   }
   // No overlapping of parameters and locals.
-  ASSERT(frame_index >= first_frame_index);
-  frame_index = first_frame_index;
+  ASSERT(next_index.value() >= first_local_index.value());
+  next_index = first_local_index;
   while (pos < num_variables()) {
     LocalVariable* variable = VariableAt(pos);
     if (variable->owner() == this) {
@@ -223,26 +226,30 @@
         AllocateContextVariable(variable, &context_owner);
         *found_captured_variables = true;
       } else {
-        variable->set_index(frame_index--);
+        variable->set_index(next_index);
+        next_index = VariableIndex(next_index.value() - 1);
       }
     }
     pos++;
   }
   // Allocate variables of all children.
-  int min_frame_index = frame_index;  // Frame index decreases with allocations.
+  VariableIndex min_index = next_index;
   LocalScope* child = this->child();
   while (child != NULL) {
-    const int dummy_parameter_index = 0;    // Ignored, since no parameters.
-    const int num_parameters_in_child = 0;  // No parameters in children scopes.
-    int child_frame_index = child->AllocateVariables(
-        dummy_parameter_index, num_parameters_in_child, frame_index,
+    // Ignored, since no parameters.
+    const VariableIndex dummy_parameter_index(0);
+
+    // No parameters in children scopes.
+    const int num_parameters_in_child = 0;
+    VariableIndex child_next_index = child->AllocateVariables(
+        dummy_parameter_index, num_parameters_in_child, next_index,
         context_owner, found_captured_variables);
-    if (child_frame_index < min_frame_index) {
-      min_frame_index = child_frame_index;
+    if (child_next_index.value() < min_index.value()) {
+      min_index = child_next_index;
     }
     child = child->sibling();
   }
-  return min_frame_index;
+  return min_index;
 }
 
 // The parser creates internal variables that start with ":"
@@ -370,7 +377,7 @@
         desc.info.declaration_pos = TokenPosition::kMinSource;
         desc.info.begin_pos = TokenPosition::kMinSource;
         desc.info.end_pos = TokenPosition::kMinSource;
-        desc.info.set_index(var->index());
+        desc.info.set_index(var->index().value());
         vars->Add(desc);
       } else if (!IsFilteredIdentifier(var->name())) {
         // This is a regular Dart variable, either stack-based or captured.
@@ -385,10 +392,10 @@
           desc.info.set_kind(RawLocalVarDescriptors::kStackVar);
           desc.info.scope_id = *scope_id;
         }
+        desc.info.set_index(var->index().value());
         desc.info.declaration_pos = var->declaration_token_pos();
         desc.info.begin_pos = var->token_pos();
         desc.info.end_pos = var->owner()->end_token_pos();
-        desc.info.set_index(var->index());
         vars->Add(desc);
       }
     }
@@ -585,7 +592,7 @@
       } else {
         context_scope.SetTypeAt(captured_idx, variable->type());
       }
-      context_scope.SetContextIndexAt(captured_idx, variable->index());
+      context_scope.SetContextIndexAt(captured_idx, variable->index().value());
       // Adjust the context level relative to the current context level,
       // since the context of the current scope will be at level 0 when
       // compiling the nested function.
@@ -621,7 +628,7 @@
                             AbstractType::ZoneHandle(context_scope.TypeAt(i)));
     }
     variable->set_is_captured();
-    variable->set_index(context_scope.ContextIndexAt(i));
+    variable->set_index(VariableIndex(context_scope.ContextIndexAt(i)));
     if (context_scope.IsFinalAt(i)) {
       variable->set_is_final();
     }
@@ -695,19 +702,4 @@
   return false;
 }
 
-int LocalVariable::BitIndexIn(intptr_t fixed_parameter_count) const {
-  ASSERT(!is_captured());
-  // Parameters have positive indexes with the lowest index being
-  // kParamEndSlotFromFp + 1.  Locals have negative indexes with the lowest
-  // (closest to 0) index being kFirstLocalSlotFromFp.
-  if (index() > 0) {
-    // Shift non-negative indexes so that the lowest one is 0.
-    return fixed_parameter_count - (index() - kParamEndSlotFromFp);
-  } else {
-    // Shift negative indexes so that the lowest one is 0 (they are still
-    // non-positive).
-    return fixed_parameter_count - (index() - kFirstLocalSlotFromFp);
-  }
-}
-
 }  // namespace dart
diff --git a/runtime/vm/scopes.h b/runtime/vm/scopes.h
index e739416..15548dc 100644
--- a/runtime/vm/scopes.h
+++ b/runtime/vm/scopes.h
@@ -5,6 +5,8 @@
 #ifndef RUNTIME_VM_SCOPES_H_
 #define RUNTIME_VM_SCOPES_H_
 
+#include <limits>
+
 #include "platform/assert.h"
 #include "platform/globals.h"
 #include "vm/allocation.h"
@@ -19,6 +21,54 @@
 class CompileType;
 class LocalScope;
 
+// Indices of [LocalVariable]s are abstract and have little todo with the
+// actual frame layout!
+//
+// There are generally 4 different kinds of [LocalVariable]s:
+//
+//    a) [LocalVariable]s refering to a parameter: The indices for those
+//       variables are assigned by the flow graph builder. Parameter n gets
+//       assigned the index (function.num_parameters - n - 1). I.e. the last
+//       parameter has index 1.
+//
+//    b) [LocalVariable]s referring to actual variables in the body of a
+//       function (either from Dart code or specially injected ones. The
+//       indices of those variables are assigned by the scope builder
+//       from 0, -1, ... -(M-1) for M local variables.
+//
+//       -> These variables participate in full SSA renaming and can therefore
+//          be used with [StoreLocalInstr]s (in addition to [LoadLocal]s).
+//
+//    c) [LocalVariable]s referring to values on the expression stack. Those are
+//       assigned by the flow graph builder. The indices of those variables are
+//       assigned by the flow graph builder (it simulates the expression stack
+//       height), they go from -NumVariabables - ExpressionHeight.
+//
+//       -> These variables participate only partially in SSA renaming and can
+//          therefore only be used with [LoadLocalInstr]s and with
+//          [StoreLocalInstr]s **where no phis are necessary**.
+//
+//    b) [LocalVariable]s referring to captured variables.  Those are never
+//       loaded/stored directly. Their only purpose is to tell the flow graph
+//       builder how many parent links to follow and into which context index to
+//       store.  The indices of those variables are assigned by the scope
+//       builder and they refer to indices into context objects.
+class VariableIndex {
+ public:
+  static const int kInvalidIndex = std::numeric_limits<int>::min();
+
+  explicit VariableIndex(int value = kInvalidIndex) : value_(value) {}
+
+  int operator==(const VariableIndex& other) { return value_ == other.value_; }
+
+  bool IsValid() const { return value_ != kInvalidIndex; }
+
+  int value() const { return value_; }
+
+ private:
+  int value_;
+};
+
 class LocalVariable : public ZoneAllocated {
  public:
   LocalVariable(TokenPosition declaration_pos,
@@ -39,7 +89,7 @@
         is_captured_parameter_(false),
         is_forced_stack_(false),
         type_check_mode_(kDoTypeCheck),
-        index_(LocalVariable::kUninitializedIndex) {
+        index_() {
     ASSERT(type.IsZoneHandle() || type.IsReadOnlyHandle());
     ASSERT(type.IsFinalized());
     ASSERT(name.IsSymbol());
@@ -89,15 +139,15 @@
 
   void set_type_check_mode(TypeCheckMode mode) { type_check_mode_ = mode; }
 
-  bool HasIndex() const { return index_ != kUninitializedIndex; }
-  int index() const {
+  bool HasIndex() const { return index_.IsValid(); }
+  VariableIndex index() const {
     ASSERT(HasIndex());
     return index_;
   }
 
   // Assign an index to a local.
-  void set_index(int index) {
-    ASSERT(index != kUninitializedIndex);
+  void set_index(VariableIndex index) {
+    ASSERT(index.IsValid());
     index_ = index;
   }
 
@@ -124,12 +174,6 @@
 
   bool Equals(const LocalVariable& other) const;
 
-  // Map the frame index to a bit-vector index.  Assumes the variable is
-  // allocated to the frame.
-  // var_count is the total number of stack-allocated variables including
-  // all parameters.
-  int BitIndexIn(intptr_t fixed_parameter_count) const;
-
  private:
   static const int kUninitializedIndex = INT_MIN;
 
@@ -151,8 +195,7 @@
   bool is_captured_parameter_;
   bool is_forced_stack_;
   TypeCheckMode type_check_mode_;
-  int index_;  // Allocation index in words relative to frame pointer (if not
-               // captured), or relative to the context pointer (if captured).
+  VariableIndex index_;
 
   friend class LocalScope;
   DISALLOW_COPY_AND_ASSIGN(LocalVariable);
@@ -334,12 +377,13 @@
   // and not in its children (we do not yet handle register parameters).
   // Locals must be listed after parameters in top scope and in its children.
   // Two locals in different sibling scopes may share the same frame slot.
+  //
   // Return the index of the next available frame slot.
-  int AllocateVariables(int first_parameter_index,
-                        int num_parameters,
-                        int first_frame_index,
-                        LocalScope* context_owner,
-                        bool* found_captured_variables);
+  VariableIndex AllocateVariables(VariableIndex first_parameter_index,
+                                  int num_parameters,
+                                  VariableIndex first_local_index,
+                                  LocalScope* context_owner,
+                                  bool* found_captured_variables);
 
   // Creates variable info for the scope and all its nested scopes.
   // Must be called after AllocateVariables() has been called.
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index cf08ad6..9308a89 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -8,6 +8,7 @@
 #include "include/dart_native_api.h"
 #include "platform/globals.h"
 
+#include "vm/base64.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/cpu.h"
 #include "vm/dart_api_impl.h"
@@ -233,6 +234,28 @@
   jsobj.AddProperty("type", "Success");
 }
 
+static bool CheckDebuggerDisabled(Thread* thread, JSONStream* js) {
+  Isolate* isolate = thread->isolate();
+  if (!isolate->compilation_allowed()) {
+    js->PrintError(kFeatureDisabled, "Debugger is disabled in AOT mode.");
+    return true;
+  }
+  if (isolate->debugger() == NULL) {
+    js->PrintError(kFeatureDisabled, "Debugger is disabled.");
+    return true;
+  }
+  return false;
+}
+
+static bool CheckCompilerDisabled(Thread* thread, JSONStream* js) {
+  Isolate* isolate = thread->isolate();
+  if (!isolate->compilation_allowed()) {
+    js->PrintError(kFeatureDisabled, "Compiler is disabled in AOT mode.");
+    return true;
+  }
+  return false;
+}
+
 static bool GetIntegerId(const char* s, intptr_t* id, int base = 10) {
   if ((s == NULL) || (*s == '\0')) {
     // Empty string.
@@ -1311,7 +1334,10 @@
 };
 
 static bool GetUnusedChangesInLastReload(Thread* thread, JSONStream* js) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
+  if (CheckCompilerDisabled(thread, js)) {
+    return true;
+  }
+
   const GrowableObjectArray& changed_in_last_reload =
       GrowableObjectArray::Handle(
           thread->isolate()->object_store()->changed_in_last_reload());
@@ -1365,11 +1391,6 @@
     }
   }
   return true;
-#else  // !defined(DART_PRECOMPILED_RUNTIME)
-  js->PrintError(kFeatureDisabled,
-                 "Cannot reload source when running a precompiled program.");
-  return true;
-#endif
 }
 
 static const MethodParameter* get_stack_params[] = {
@@ -1377,13 +1398,11 @@
 };
 
 static bool GetStack(Thread* thread, JSONStream* js) {
-  Isolate* isolate = thread->isolate();
-  if (isolate->debugger() == NULL) {
-    js->PrintError(kFeatureDisabled,
-                   "Cannot get stack when debugger disabled.");
+  if (CheckDebuggerDisabled(thread, js)) {
     return true;
   }
-  ASSERT(isolate->compilation_allowed());
+
+  Isolate* isolate = thread->isolate();
   DebuggerStackTrace* stack = isolate->debugger()->StackTrace();
   DebuggerStackTrace* async_causal_stack =
       isolate->debugger()->AsyncCausalStackTrace();
@@ -2341,11 +2360,10 @@
 }
 
 static bool Evaluate(Thread* thread, JSONStream* js) {
-  if (!thread->isolate()->compilation_allowed()) {
-    js->PrintError(kFeatureDisabled,
-                   "Cannot evaluate when running a precompiled program.");
+  if (CheckDebuggerDisabled(thread, js)) {
     return true;
   }
+
   const char* target_id = js->LookupParam("targetId");
   if (target_id == NULL) {
     PrintMissingParamError(js, "targetId");
@@ -2415,18 +2433,253 @@
   return true;
 }
 
+static const MethodParameter* build_expression_evaluation_scope_params[] = {
+    RUNNABLE_ISOLATE_PARAMETER,
+    new IdParameter("frameIndex", true),
+    NULL,
+};
+
+static bool BuildExpressionEvaluationScope(Thread* thread, JSONStream* js) {
+  if (CheckDebuggerDisabled(thread, js)) {
+    return true;
+  }
+
+  Isolate* isolate = thread->isolate();
+  DebuggerStackTrace* stack = isolate->debugger()->StackTrace();
+  intptr_t framePos = UIntParameter::Parse(js->LookupParam("frameIndex"));
+  if (framePos >= stack->Length()) {
+    PrintInvalidParamError(js, "frameIndex");
+    return true;
+  }
+
+  Zone* zone = thread->zone();
+  const GrowableObjectArray& param_names =
+      GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
+  const GrowableObjectArray& param_values =
+      GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
+  if (BuildScope(thread, js, param_names, param_values)) {
+    return true;
+  }
+
+  ActivationFrame* frame = stack->FrameAt(framePos);
+  const GrowableObjectArray& type_params_names =
+      GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
+  frame->BuildParameters(param_names, param_values, type_params_names);
+
+  JSONObject report(js);
+  {
+    JSONArray jsonParamNames(&report, "param_names");
+
+    String& param_name = String::Handle(zone);
+    for (intptr_t i = 0; i < param_names.Length(); i++) {
+      param_name ^= param_names.At(i);
+      jsonParamNames.AddValue(param_name.ToCString());
+    }
+  }
+
+  {
+    JSONArray jsonTypeParamsNames(&report, "type_params_names");
+    String& type_param_name = String::Handle(zone);
+    for (intptr_t i = 0; i < type_params_names.Length(); i++) {
+      type_param_name ^= type_params_names.At(i);
+      jsonTypeParamsNames.AddValue(type_param_name.ToCString());
+    }
+  }
+  String& klass_name = String::Handle(zone);
+  String& library_uri = String::Handle(zone);
+  bool isStatic = false;
+  if (frame->function().is_static()) {
+    const Class& cls = Class::Handle(zone, frame->function().Owner());
+    if (!cls.IsTopLevel()) {
+      klass_name ^= cls.UserVisibleName();
+    }
+    library_uri ^= Library::Handle(zone, cls.library()).url();
+    isStatic = !cls.IsTopLevel();
+  } else {
+    const Class& method_cls = Class::Handle(zone, frame->function().origin());
+    library_uri ^= Library::Handle(zone, method_cls.library()).url();
+    klass_name ^= method_cls.UserVisibleName();
+  }
+  report.AddProperty("libraryUri", library_uri.ToCString());
+  if (!klass_name.IsNull()) {
+    report.AddProperty("klass", klass_name.ToCString());
+  }
+  report.AddProperty("isStatic", isStatic);
+
+  return true;
+}
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+// Parse comma-separated list of values, put them into values
+static bool ParseCSVList(const char* csv_list,
+                         const GrowableObjectArray& values) {
+  Zone* zone = Thread::Current()->zone();
+  String& s = String::Handle(zone);
+  const char* c = csv_list;
+  if (*c++ != '[') return false;
+  while (IsWhitespace(*c) && *c != '\0') {
+    c++;
+  }
+  while (*c != '\0') {
+    const char* value = c;
+    while (*c != '\0' && *c != ']' && *c != ',' && !IsWhitespace(*c)) {
+      c++;
+    }
+    if (c > value) {
+      s ^= String::New(zone->MakeCopyOfStringN(value, c - value));
+      values.Add(s);
+    }
+    switch (*c) {
+      case '\0':
+        return false;
+      case ',':
+        c++;
+        break;
+      case ']':
+        return true;
+    }
+    while (IsWhitespace(*c) && *c != '\0') {
+      c++;
+    }
+  }
+  return false;
+}
+#endif
+
+static const MethodParameter* compile_expression_params[] = {
+    RUNNABLE_ISOLATE_PARAMETER,
+    new StringParameter("expression", true),
+    new StringParameter("definitions", false),
+    new StringParameter("typeDefinitions", false),
+    new StringParameter("libraryUri", true),
+    new StringParameter("klass", false),
+    new BoolParameter("isStatic", false),
+    NULL,
+};
+
+static bool CompileExpression(Thread* thread, JSONStream* js) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+  js->PrintError(kFeatureDisabled, "Debugger is disabled in AOT mode.");
+  return true;
+#else
+  if (CheckDebuggerDisabled(thread, js)) {
+    return true;
+  }
+
+  if (!KernelIsolate::IsRunning()) {
+    // Assume we are in dart1 mode where separate compilation is not required.
+    // 0-length kernelBytes signals that we should evaluate expression in dart1
+    // mode.
+    // TODO(aam): When dart1 is no longer supported we need to return error
+    // here.
+    JSONObject report(js);
+    const uint8_t kernel_bytes[] = {0};
+    report.AddPropertyBase64("kernelBytes", kernel_bytes, 0);
+    return true;
+  }
+
+  bool is_static = BoolParameter::Parse(js->LookupParam("isStatic"), false);
+
+  Dart_KernelCompilationResult compilation_result;
+  const GrowableObjectArray& params =
+      GrowableObjectArray::Handle(thread->zone(), GrowableObjectArray::New());
+  if (!ParseCSVList(js->LookupParam("definitions"), params)) {
+    PrintInvalidParamError(js, "definitions");
+    return true;
+  }
+
+  const GrowableObjectArray& type_params =
+      GrowableObjectArray::Handle(thread->zone(), GrowableObjectArray::New());
+  if (!ParseCSVList(js->LookupParam("typeDefinitions"), type_params)) {
+    PrintInvalidParamError(js, "typedDefinitions");
+    return true;
+  }
+
+  {
+    TransitionVMToNative transition(thread);
+    compilation_result = KernelIsolate::CompileExpressionToKernel(
+        js->LookupParam("expression"),
+        Array::Handle(Array::MakeFixedLength(params)),
+        Array::Handle(Array::MakeFixedLength(type_params)),
+        js->LookupParam("libraryUri"), js->LookupParam("klass"), is_static);
+  }
+
+  if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
+    js->PrintError(kExpressionCompilationError, compilation_result.error);
+    free(compilation_result.error);
+    return true;
+  }
+
+  const uint8_t* kernel_bytes = compilation_result.kernel;
+  intptr_t kernel_length = compilation_result.kernel_size;
+  ASSERT(kernel_bytes != NULL);
+
+  JSONObject report(js);
+  report.AddPropertyBase64("kernelBytes", kernel_bytes, kernel_length);
+  return true;
+#endif
+}
+
+static const MethodParameter* evaluate_compiled_expression_params[] = {
+    RUNNABLE_ISOLATE_PARAMETER,
+    new UIntParameter("frameIndex", true),
+    new StringParameter("kernelBytes", true),
+    NULL,
+};
+
+static bool EvaluateCompiledExpression(Thread* thread, JSONStream* js) {
+  if (CheckDebuggerDisabled(thread, js)) {
+    return true;
+  }
+
+  Isolate* isolate = thread->isolate();
+  DebuggerStackTrace* stack = isolate->debugger()->StackTrace();
+  intptr_t frame_pos = UIntParameter::Parse(js->LookupParam("frameIndex"));
+  if (frame_pos >= stack->Length()) {
+    PrintInvalidParamError(js, "frameIndex");
+    return true;
+  }
+  Zone* zone = thread->zone();
+  const GrowableObjectArray& param_names =
+      GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
+  const GrowableObjectArray& param_values =
+      GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
+  if (BuildScope(thread, js, param_names, param_values)) {
+    return true;
+  }
+
+  ActivationFrame* frame = stack->FrameAt(frame_pos);
+  const GrowableObjectArray& type_params_names =
+      GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
+  TypeArguments& type_arguments = TypeArguments::Handle(
+      zone,
+      frame->BuildParameters(param_names, param_values, type_params_names));
+
+  intptr_t kernel_length;
+  const char* kernel_bytes_str = js->LookupParam("kernelBytes");
+  uint8_t* kernel_bytes = DecodeBase64(zone, kernel_bytes_str, &kernel_length);
+
+  const Object& result = Object::Handle(
+      zone, frame->EvaluateCompiledExpression(
+                kernel_bytes, kernel_length,
+                Array::Handle(zone, Array::MakeFixedLength(type_params_names)),
+                Array::Handle(zone, Array::MakeFixedLength(param_values)),
+                type_arguments));
+  result.PrintJSON(js, true);
+  return true;
+}
+
 static const MethodParameter* evaluate_in_frame_params[] = {
     RUNNABLE_ISOLATE_PARAMETER, new UIntParameter("frameIndex", true),
     new MethodParameter("expression", true), NULL,
 };
 
 static bool EvaluateInFrame(Thread* thread, JSONStream* js) {
-  Isolate* isolate = thread->isolate();
-  if (!isolate->compilation_allowed()) {
-    js->PrintError(kFeatureDisabled,
-                   "Cannot evaluate when running a precompiled program.");
+  if (CheckDebuggerDisabled(thread, js)) {
     return true;
   }
+
+  Isolate* isolate = thread->isolate();
   DebuggerStackTrace* stack = isolate->debugger()->StackTrace();
   intptr_t framePos = UIntParameter::Parse(js->LookupParam("frameIndex"));
   if (framePos >= stack->Length()) {
@@ -2556,12 +2809,10 @@
 };
 
 static bool GetSourceReport(Thread* thread, JSONStream* js) {
-  if (!thread->isolate()->compilation_allowed()) {
-    js->PrintError(
-        kFeatureDisabled,
-        "Cannot get source report when running a precompiled program.");
+  if (CheckCompilerDisabled(thread, js)) {
     return true;
   }
+
   const char* reports_str = js->LookupParam("reports");
   const EnumListParameter* reports_parameter =
       static_cast<const EnumListParameter*>(get_source_report_params[1]);
@@ -2631,13 +2882,15 @@
 };
 
 static bool ReloadSources(Thread* thread, JSONStream* js) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  Isolate* isolate = thread->isolate();
-  if (!isolate->compilation_allowed()) {
-    js->PrintError(kFeatureDisabled,
-                   "Cannot reload source when running a precompiled program.");
+#if defined(DART_PRECOMPILED_RUNTIME)
+  js->PrintError(kFeatureDisabled, "Compiler is disabled in AOT mode.");
+  return true;
+#else
+  if (CheckCompilerDisabled(thread, js)) {
     return true;
   }
+
+  Isolate* isolate = thread->isolate();
   Dart_LibraryTagHandler handler = isolate->library_tag_handler();
   if (handler == NULL) {
     js->PrintError(kFeatureDisabled,
@@ -2669,11 +2922,7 @@
   Service::CheckForPause(isolate, js);
 
   return true;
-#else   // !defined(DART_PRECOMPILED_RUNTIME)
-  js->PrintError(kFeatureDisabled,
-                 "Cannot reload source when running a precompiled program.");
-  return true;
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+#endif
 }
 
 void Service::CheckForPause(Isolate* isolate, JSONStream* stream) {
@@ -2701,12 +2950,10 @@
 static bool AddBreakpointCommon(Thread* thread,
                                 JSONStream* js,
                                 const String& script_uri) {
-  if (!thread->isolate()->compilation_allowed()) {
-    js->PrintError(
-        kFeatureDisabled,
-        "Cannot use breakpoints when running a precompiled program.");
+  if (CheckDebuggerDisabled(thread, js)) {
     return true;
   }
+
   const char* line_param = js->LookupParam("line");
   intptr_t line = UIntParameter::Parse(line_param);
   const char* col_param = js->LookupParam("column");
@@ -2742,12 +2989,10 @@
 };
 
 static bool AddBreakpoint(Thread* thread, JSONStream* js) {
-  if (!thread->isolate()->compilation_allowed()) {
-    js->PrintError(
-        kFeatureDisabled,
-        "Cannot use breakpoints when running a precompiled program.");
+  if (CheckDebuggerDisabled(thread, js)) {
     return true;
   }
+
   const char* script_id_param = js->LookupParam("scriptId");
   Object& obj = Object::Handle(LookupHeapObject(thread, script_id_param, NULL));
   if (obj.raw() == Object::sentinel().raw() || !obj.IsScript()) {
@@ -2769,12 +3014,10 @@
 };
 
 static bool AddBreakpointWithScriptUri(Thread* thread, JSONStream* js) {
-  if (!thread->isolate()->compilation_allowed()) {
-    js->PrintError(
-        kFeatureDisabled,
-        "Cannot use breakpoints when running a precompiled program.");
+  if (CheckDebuggerDisabled(thread, js)) {
     return true;
   }
+
   const char* script_uri_param = js->LookupParam("scriptUri");
   const String& script_uri = String::Handle(String::New(script_uri_param));
   return AddBreakpointCommon(thread, js, script_uri);
@@ -2785,12 +3028,10 @@
 };
 
 static bool AddBreakpointAtEntry(Thread* thread, JSONStream* js) {
-  if (!thread->isolate()->compilation_allowed()) {
-    js->PrintError(
-        kFeatureDisabled,
-        "Cannot use breakpoints when running a precompiled program.");
+  if (CheckDebuggerDisabled(thread, js)) {
     return true;
   }
+
   const char* function_id = js->LookupParam("functionId");
   Object& obj = Object::Handle(LookupHeapObject(thread, function_id, NULL));
   if (obj.raw() == Object::sentinel().raw() || !obj.IsFunction()) {
@@ -2815,12 +3056,10 @@
 };
 
 static bool AddBreakpointAtActivation(Thread* thread, JSONStream* js) {
-  if (!thread->isolate()->compilation_allowed()) {
-    js->PrintError(
-        kFeatureDisabled,
-        "Cannot use breakpoints when running a precompiled program.");
+  if (CheckDebuggerDisabled(thread, js)) {
     return true;
   }
+
   const char* object_id = js->LookupParam("objectId");
   Object& obj = Object::Handle(LookupHeapObject(thread, object_id, NULL));
   if (obj.raw() == Object::sentinel().raw() || !obj.IsInstance()) {
@@ -2844,12 +3083,10 @@
 };
 
 static bool RemoveBreakpoint(Thread* thread, JSONStream* js) {
-  if (!thread->isolate()->compilation_allowed()) {
-    js->PrintError(
-        kFeatureDisabled,
-        "Cannot use breakpoints when running a precompiled program.");
+  if (CheckDebuggerDisabled(thread, js)) {
     return true;
   }
+
   if (!js->HasParam("breakpointId")) {
     PrintMissingParamError(js, "breakpointId");
     return true;
@@ -3456,11 +3693,11 @@
   Isolate* isolate = thread->isolate();
   if (js->HasParam("gc")) {
     if (js->ParamIs("gc", "scavenge")) {
-      isolate->heap()->CollectGarbage(Heap::kNew);
+      isolate->heap()->CollectGarbage(Heap::kScavenge, Heap::kDebugging);
     } else if (js->ParamIs("gc", "mark-sweep")) {
-      isolate->heap()->CollectGarbage(Heap::kOld, Heap::kOldSpace);
+      isolate->heap()->CollectGarbage(Heap::kMarkSweep, Heap::kDebugging);
     } else if (js->ParamIs("gc", "mark-compact")) {
-      isolate->heap()->CollectGarbage(Heap::kOld, Heap::kCompaction);
+      isolate->heap()->CollectGarbage(Heap::kMarkCompact, Heap::kDebugging);
     } else {
       PrintInvalidParamError(js, "gc");
       return true;
@@ -4173,12 +4410,10 @@
 };
 
 static bool SetTraceClassAllocation(Thread* thread, JSONStream* js) {
-  if (!thread->isolate()->compilation_allowed()) {
-    js->PrintError(
-        kFeatureDisabled,
-        "Cannot trace allocation when running a precompiled program.");
+  if (CheckCompilerDisabled(thread, js)) {
     return true;
   }
+
   const char* class_id = js->LookupParam("classId");
   const bool enable = BoolParameter::Parse(js->LookupParam("enable"));
   intptr_t cid = -1;
@@ -4232,7 +4467,7 @@
   }
   {
     JSONArray internals(&map, "Int");
-    for (intptr_t id = kIntegerCid; id <= kBigintCid; ++id) {
+    for (intptr_t id = kIntegerCid; id <= kMintCid; ++id) {
       DEFINE_ADD_VALUE_F(id);
     }
   }
@@ -4288,10 +4523,13 @@
     add_breakpoint_at_entry_params },
   { "_addBreakpointAtActivation", AddBreakpointAtActivation,
     add_breakpoint_at_activation_params },
+  { "_buildExpressionEvaluationScope", BuildExpressionEvaluationScope,
+    build_expression_evaluation_scope_params },
   { "_clearCpuProfile", ClearCpuProfile,
     clear_cpu_profile_params },
   { "_clearVMTimeline", ClearVMTimeline,
     clear_vm_timeline_params, },
+  { "_compileExpression", CompileExpression, compile_expression_params },
   { "_enableProfiler", EnableProfiler,
     enable_profiler_params, },
   { "evaluate", Evaluate,
@@ -4375,6 +4613,8 @@
     resume_params },
   { "_requestHeapSnapshot", RequestHeapSnapshot,
     request_heap_snapshot_params },
+  { "_evaluateCompiledExpression", EvaluateCompiledExpression,
+    evaluate_compiled_expression_params },
   { "setExceptionPauseMode", SetExceptionPauseMode,
     set_exception_pause_mode_params },
   { "setFlag", SetFlag,
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index e084402..6edc8f2 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -15,7 +15,7 @@
 namespace dart {
 
 #define SERVICE_PROTOCOL_MAJOR_VERSION 3
-#define SERVICE_PROTOCOL_MINOR_VERSION 8
+#define SERVICE_PROTOCOL_MINOR_VERSION 9
 
 class Array;
 class EmbedderServiceHandler;
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index cf548a5..baa0df8 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -1,8 +1,8 @@
-# Dart VM Service Protocol 3.8
+# Dart VM Service Protocol 3.9
 
 > Please post feedback to the [observatory-discuss group][discuss-list]
 
-This document describes of _version 3.8_ of the Dart VM Service Protocol. This
+This document describes of _version 3.9_ of the Dart VM Service Protocol. This
 protocol is used to communicate with a running Dart Virtual Machine.
 
 To use the Service Protocol, start the VM with the *--observe* flag.
@@ -190,6 +190,10 @@
 107 | Cannot resume execution | The isolate could not be resumed
 108 | Isolate is reloading | The isolate is currently processing another reload request
 109 | Isolate cannot be reloaded | The isolate has an unhandled exception and can no longer be reloaded
+110 | Isolate must have reloaded | Failed to find differences in last hot reload request
+111 | Service already registered | Service with such name has already been registered by this client
+112 | Service disappeared | Failed to fulfill service request, likely service handler is no longer available
+113 | Expression compilation error | Request to compile expression failed
 
 
 
@@ -494,6 +498,9 @@
 targets respectively. This means bindings provided in _scope_ may shadow
 instance members, class members and top-level members.
 
+If expression is failed to parse and compile, then [rpc error](#rpc-error) 113
+"Expression compilation error" is returned.
+
 If an error occurs while evaluating the expression, an [@Error](#error)
 reference will be returned.
 
@@ -520,6 +527,9 @@
 provided in _scope_ may shadow instance members, class members, top-level
 members, parameters and locals.
 
+If expression is failed to parse and compile, then [rpc error](#rpc-error) 113
+"Expression compilation error" is returned.
+
 If an error occurs while evaluating the expression, an [@Error](#error)
 reference will be returned.
 
diff --git a/runtime/vm/service/service_dev.md b/runtime/vm/service/service_dev.md
index 9426433..b4bc314 100644
--- a/runtime/vm/service/service_dev.md
+++ b/runtime/vm/service/service_dev.md
@@ -1,8 +1,8 @@
-# Dart VM Service Protocol 3.9-dev
+# Dart VM Service Protocol 3.10-dev
 
 > Please post feedback to the [observatory-discuss group][discuss-list]
 
-This document describes of _version 3.9-dev_ of the Dart VM Service Protocol. This
+This document describes of _version 3.10-dev_ of the Dart VM Service Protocol. This
 protocol is used to communicate with a running Dart Virtual Machine.
 
 To use the Service Protocol, start the VM with the *--observe* flag.
@@ -190,6 +190,10 @@
 107 | Cannot resume execution | The isolate could not be resumed
 108 | Isolate is reloading | The isolate is currently processing another reload request
 109 | Isolate cannot be reloaded | The isolate has an unhandled exception and can no longer be reloaded
+110 | Isolate must have reloaded | Failed to find differences in last hot reload request
+111 | Service already registered | Service with such name has already been registered by this client
+112 | Service disappeared | Failed to fulfill service request, likely service handler is no longer available
+113 | Expression compilation error | Request to compile expression failed
 
 
 
@@ -494,6 +498,9 @@
 targets respectively. This means bindings provided in _scope_ may shadow
 instance members, class members and top-level members.
 
+If expression is failed to parse and compile, then [rpc error](#rpc-error) 113
+"Expression compilation error" is returned.
+
 If an error occurs while evaluating the expression, an [@Error](#error)
 reference will be returned.
 
@@ -520,6 +527,9 @@
 provided in _scope_ may shadow instance members, class members, top-level
 members, parameters and locals.
 
+If expression is failed to parse and compile, then [rpc error](#rpc-error) 113
+"Expression compilation error" is returned.
+
 If an error occurs while evaluating the expression, an [@Error](#error)
 reference will be returned.
 
diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
index 46e467b..7e4ca4e 100644
--- a/runtime/vm/simulator_dbc.cc
+++ b/runtime/vm/simulator_dbc.cc
@@ -152,10 +152,6 @@
           case kMintCid:
             return (static_cast<RawMint*>(lhs)->ptr()->value_ ==
                     static_cast<RawMint*>(rhs)->ptr()->value_);
-
-          case kBigintCid:
-            return (DLRT_BigintCompare(static_cast<RawBigint*>(lhs),
-                                       static_cast<RawBigint*>(rhs)) == 0);
         }
       }
     }
@@ -1222,7 +1218,7 @@
   uint16_t rA;  // A component of the currently executing op.
 
   if (fp_ == NULL) {
-    fp_ = reinterpret_cast<RawObject**>(stack_);
+    fp_ = reinterpret_cast<RawObject**>(stack_base_);
   }
 
   // Save current VM tag and mark thread as executing Dart code.
@@ -1247,7 +1243,7 @@
   //       | arg 1       | -+
   //       | function    | -+
   //       | code        |  |
-  //       | callee PC   | ---> special fake PC marking an entry frame
+  //       | caller PC   | ---> special fake PC marking an entry frame
   //  SP > | fp_         |  |
   //  FP > | ........... |   > normal Dart frame (see stack_frame_dbc.h)
   //                        |
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index d1fb4ba..68ebca2 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -992,7 +992,6 @@
   V(OneByteString)                                                             \
   V(TwoByteString)                                                             \
   V(Mint)                                                                      \
-  V(Bigint)                                                                    \
   V(Double)                                                                    \
   V(ImmutableArray)
 
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index b630cc3..605d300 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -39,7 +39,6 @@
 class PageSpace;
 class RawApiError;
 class RawArray;
-class RawBigint;
 class RawBoundedType;
 class RawCapability;
 class RawClass;
@@ -69,7 +68,6 @@
 class RawMegamorphicCache;
 class RawMint;
 class RawMixinAppType;
-class RawBigint;
 class RawNamespace;
 class RawObject;
 class RawObjectPool;
@@ -470,7 +468,6 @@
 
   friend class ApiError;
   friend class Array;
-  friend class Bigint;
   friend class BoundedType;
   friend class Class;
   friend class Closure;
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index dc70397..e3d9d82 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -79,14 +79,6 @@
     case Dart_CObject_kInt64:
       EXPECT_EQ(first->value.as_int64, second->value.as_int64);
       break;
-    case Dart_CObject_kBigint: {
-      char* first_hex_value = TestCase::BigintToHexValue(first);
-      char* second_hex_value = TestCase::BigintToHexValue(second);
-      EXPECT_STREQ(first_hex_value, second_hex_value);
-      free(first_hex_value);
-      free(second_hex_value);
-      break;
-    }
     case Dart_CObject_kDouble:
       EXPECT_EQ(first->value.as_double, second->value.as_double);
       break;
@@ -392,97 +384,6 @@
   delete message;
 }
 
-TEST_CASE(SerializeBigint) {
-  if (Bigint::IsDisabled()) {
-    return;
-  }
-  // Write snapshot with object content.
-  const char* cstr = "0x270FFFFFFFFFFFFFD8F0";
-  const String& str = String::Handle(String::New(cstr));
-  Bigint& bigint = Bigint::Handle();
-  bigint ^= Integer::NewCanonical(str);
-  MessageWriter writer(true);
-  Message* message =
-      writer.WriteMessage(bigint, ILLEGAL_PORT, Message::kNormalPriority);
-
-  // Read object back from the snapshot.
-  MessageSnapshotReader reader(message, thread);
-  Bigint& obj = Bigint::Handle();
-  obj ^= reader.ReadObject();
-
-  Zone* zone = Thread::Current()->zone();
-  EXPECT_STREQ(bigint.ToHexCString(zone), obj.ToHexCString(zone));
-
-  // Read object back from the snapshot into a C structure.
-  ApiNativeScope scope;
-  ApiMessageReader api_reader(message);
-  Dart_CObject* root = api_reader.ReadMessage();
-  EXPECT_NOTNULL(root);
-  EXPECT_EQ(Dart_CObject_kBigint, root->type);
-  char* hex_value = TestCase::BigintToHexValue(root);
-  EXPECT_STREQ(cstr, hex_value);
-  free(hex_value);
-  CheckEncodeDecodeMessage(root);
-
-  delete message;
-}
-
-Dart_CObject* SerializeAndDeserializeBigint(const Bigint& bigint) {
-  // Write snapshot with object content.
-  MessageWriter writer(true);
-  Message* message =
-      writer.WriteMessage(bigint, ILLEGAL_PORT, Message::kNormalPriority);
-
-  {
-    // Switch to a regular zone, where VM handle allocation is allowed.
-    Thread* thread = Thread::Current();
-    StackZone zone(thread);
-    // Read object back from the snapshot.
-    MessageSnapshotReader reader(message, thread);
-    Bigint& serialized_bigint = Bigint::Handle();
-    serialized_bigint ^= reader.ReadObject();
-    const char* str1 = bigint.ToHexCString(thread->zone());
-    const char* str2 = serialized_bigint.ToHexCString(thread->zone());
-    EXPECT_STREQ(str1, str2);
-  }
-
-  // Read object back from the snapshot into a C structure.
-  ApiMessageReader api_reader(message);
-  Dart_CObject* root = api_reader.ReadMessage();
-  // Bigint not supported.
-  EXPECT_NOTNULL(root);
-  CheckEncodeDecodeMessage(root);
-
-  delete message;
-
-  return root;
-}
-
-void CheckBigint(const char* bigint_value) {
-  ApiNativeScope scope;
-  StackZone zone(Thread::Current());
-  Bigint& bigint = Bigint::Handle();
-  bigint ^= Bigint::NewFromCString(bigint_value);
-  Dart_CObject* bigint_cobject = SerializeAndDeserializeBigint(bigint);
-  EXPECT_EQ(Dart_CObject_kBigint, bigint_cobject->type);
-  char* hex_value = TestCase::BigintToHexValue(bigint_cobject);
-  EXPECT_STREQ(bigint_value, hex_value);
-  free(hex_value);
-}
-
-TEST_CASE(SerializeBigint2) {
-  if (Bigint::IsDisabled()) {
-    return;
-  }
-  CheckBigint("0x0");
-  CheckBigint("0x1");
-  CheckBigint("-0x1");
-  CheckBigint("0x11111111111111111111");
-  CheckBigint("-0x11111111111111111111");
-  CheckBigint("0x9876543210987654321098765432109876543210");
-  CheckBigint("-0x9876543210987654321098765432109876543210");
-}
-
 #define TEST_ROUND_TRIP_IDENTICAL(object)                                      \
   {                                                                            \
     MessageWriter writer(true);                                                \
@@ -1891,7 +1792,7 @@
 }
 
 VM_UNIT_TEST_CASE(DartGeneratedMessages) {
-  static const char* kCustomIsolateScriptCommonChars =
+  static const char* kCustomIsolateScriptChars =
       "final int kArrayLength = 10;\n"
       "getSmi() {\n"
       "  return 42;\n"
@@ -1920,34 +1821,18 @@
       "getList() {\n"
       "  return new List(kArrayLength);\n"
       "}\n";
-  static const char* kCustomIsolateScriptBigintChars =
-      "getBigint() {\n"
-      "  return -0x424242424242424242424242424242424242;\n"
-      "}\n";
 
   TestCase::CreateTestIsolate();
   Isolate* isolate = Isolate::Current();
   EXPECT(isolate != NULL);
   Dart_EnterScope();
 
-  const char* scriptChars = kCustomIsolateScriptCommonChars;
-  if (!Bigint::IsDisabled()) {
-    scriptChars = OS::SCreate(Thread::Current()->zone(), "%s%s", scriptChars,
-                              kCustomIsolateScriptBigintChars);
-  }
-
-  Dart_Handle lib = TestCase::LoadTestScript(scriptChars, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kCustomIsolateScriptChars, NULL);
   EXPECT_VALID(lib);
   Dart_Handle smi_result;
   smi_result = Dart_Invoke(lib, NewString("getSmi"), 0, NULL);
   EXPECT_VALID(smi_result);
 
-  Dart_Handle bigint_result = NULL;
-  if (!Bigint::IsDisabled()) {
-    bigint_result = Dart_Invoke(lib, NewString("getBigint"), 0, NULL);
-    EXPECT_VALID(bigint_result);
-  }
-
   Dart_Handle ascii_string_result;
   ascii_string_result = Dart_Invoke(lib, NewString("getAsciiString"), 0, NULL);
   EXPECT_VALID(ascii_string_result);
@@ -2012,26 +1897,6 @@
       CheckEncodeDecodeMessage(root);
       delete message;
     }
-    if (!Bigint::IsDisabled()) {
-      StackZone zone(thread);
-      Bigint& bigint = Bigint::Handle();
-      bigint ^= Api::UnwrapHandle(bigint_result);
-      MessageWriter writer(false);
-      Message* message =
-          writer.WriteMessage(bigint, ILLEGAL_PORT, Message::kNormalPriority);
-
-      // Read object back from the snapshot into a C structure.
-      ApiNativeScope scope;
-      ApiMessageReader api_reader(message);
-      Dart_CObject* root = api_reader.ReadMessage();
-      EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject_kBigint, root->type);
-      char* hex_value = TestCase::BigintToHexValue(root);
-      EXPECT_STREQ("-0x424242424242424242424242424242424242", hex_value);
-      free(hex_value);
-      CheckEncodeDecodeMessage(root);
-      delete message;
-    }
     CheckString(ascii_string_result, "Hello, world!");
     CheckString(non_ascii_string_result, "Blåbærgrød");
     CheckString(non_bmp_string_result,
@@ -2387,7 +2252,7 @@
 
 VM_UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) {
   const int kArrayLength = 10;
-  static const char* kScriptCommonChars =
+  static const char* kScriptChars =
       "import 'dart:typed_data';\n"
       "final int kArrayLength = 10;\n"
       "getStringList() {\n"
@@ -2437,26 +2302,13 @@
       "  }\n"
       "  return list;\n"
       "}\n";
-  static const char* kScriptBigintChars =
-      "getBigintList() {\n"
-      "  var bigint = 0x1234567890123456789012345678901234567890;\n"
-      "  var list = new List(kArrayLength);\n"
-      "  for (var i = 0; i < kArrayLength; i++) list[i] = bigint;\n"
-      "  return list;\n"
-      "}\n";
 
   TestCase::CreateTestIsolate();
   Thread* thread = Thread::Current();
   EXPECT(thread->isolate() != NULL);
   Dart_EnterScope();
 
-  const char* scriptChars = kScriptCommonChars;
-  if (!Bigint::IsDisabled()) {
-    scriptChars =
-        OS::SCreate(thread->zone(), "%s%s", scriptChars, kScriptBigintChars);
-  }
-
-  Dart_Handle lib = TestCase::LoadTestScript(scriptChars, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   EXPECT_VALID(lib);
 
   {
@@ -2495,24 +2347,6 @@
       }
       delete message;
     }
-    if (!Bigint::IsDisabled()) {
-      // Generate a list of bigints from Dart code.
-      Message* message = GetSerialized(lib, "getBigintList");
-      ApiNativeScope scope;
-      Dart_CObject* root = GetDeserialized(message);
-      EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject_kArray, root->type);
-      EXPECT_EQ(kArrayLength, root->value.as_array.length);
-      for (int i = 0; i < kArrayLength; i++) {
-        Dart_CObject* element = root->value.as_array.values[i];
-        EXPECT_EQ(root->value.as_array.values[0], element);
-        EXPECT_EQ(Dart_CObject_kBigint, element->type);
-        char* hex_value = TestCase::BigintToHexValue(element);
-        EXPECT_STREQ("0x1234567890123456789012345678901234567890", hex_value);
-        free(hex_value);
-      }
-      delete message;
-    }
     {
       // Generate a list of doubles from Dart code.
       Message* message = GetSerialized(lib, "getDoubleList");
@@ -2620,7 +2454,7 @@
 
 VM_UNIT_TEST_CASE(DartGeneratedArrayLiteralMessagesWithBackref) {
   const int kArrayLength = 10;
-  static const char* kScriptCommonChars =
+  static const char* kScriptChars =
       "import 'dart:typed_data';\n"
       "final int kArrayLength = 10;\n"
       "getStringList() {\n"
@@ -2676,25 +2510,13 @@
       "  }\n"
       "  return list;\n"
       "}\n";
-  static const char* kScriptBigintChars =
-      "getBigintList() {\n"
-      "  var bigint = 0x1234567890123456789012345678901234567890;\n"
-      "  var list = [bigint, bigint, bigint, bigint, bigint,\n"
-      "              bigint, bigint, bigint, bigint, bigint];\n"
-      "  return list;\n"
-      "}\n";
 
   TestCase::CreateTestIsolate();
   Thread* thread = Thread::Current();
   EXPECT(thread->isolate() != NULL);
   Dart_EnterScope();
 
-  const char* scriptChars = kScriptCommonChars;
-  if (!Bigint::IsDisabled()) {
-    scriptChars =
-        OS::SCreate(thread->zone(), "%s%s", scriptChars, kScriptBigintChars);
-  }
-  Dart_Handle lib = TestCase::LoadTestScript(scriptChars, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   EXPECT_VALID(lib);
 
   {
@@ -2733,24 +2555,6 @@
       }
       delete message;
     }
-    if (!Bigint::IsDisabled()) {
-      // Generate a list of bigints from Dart code.
-      Message* message = GetSerialized(lib, "getBigintList");
-      ApiNativeScope scope;
-      Dart_CObject* root = GetDeserialized(message);
-      EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject_kArray, root->type);
-      EXPECT_EQ(kArrayLength, root->value.as_array.length);
-      for (int i = 0; i < kArrayLength; i++) {
-        Dart_CObject* element = root->value.as_array.values[i];
-        EXPECT_EQ(root->value.as_array.values[0], element);
-        EXPECT_EQ(Dart_CObject_kBigint, element->type);
-        char* hex_value = TestCase::BigintToHexValue(element);
-        EXPECT_STREQ("0x1234567890123456789012345678901234567890", hex_value);
-        free(hex_value);
-      }
-      delete message;
-    }
     {
       // Generate a list of doubles from Dart code.
       Message* message = GetSerialized(lib, "getDoubleList");
diff --git a/runtime/vm/snapshot_test.dart b/runtime/vm/snapshot_test.dart
index 8c0d8d9..a8e037d 100644
--- a/runtime/vm/snapshot_test.dart
+++ b/runtime/vm/snapshot_test.dart
@@ -1332,6 +1332,7 @@
       Expect.equals(true, identical(replyObject[0], replyObject[2][2]));
       Expect.equals(true, identical(replyObject[2], replyObject[4][0]));
       Expect.equals(true, identical(replyObject[0][0], replyObject[0][2]));
+      // TODO(alexmarkov): Revise this comment.
       // Bigint literals are not canonicalized so do a == check.
       Expect.equals(true, replyObject[0][3] == replyObject[4][4]);
     });
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 578129c..9cec45e 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -15,12 +15,43 @@
 #include "vm/parser.h"
 #include "vm/raw_object.h"
 #include "vm/reusable_handles.h"
+#include "vm/scopes.h"
 #include "vm/stub_code.h"
 #include "vm/visitor.h"
 
 namespace dart {
 
+intptr_t FrameSlotForVariable(const LocalVariable* variable) {
+  ASSERT(!variable->is_captured());
+  return FrameSlotForVariableIndex(variable->index().value());
+}
+
+intptr_t FrameOffsetInBytesForVariable(const LocalVariable* variable) {
+  return FrameSlotForVariable(variable) * kWordSize;
+}
+
+intptr_t FrameSlotForVariableIndex(intptr_t variable_index) {
+  // Variable indices are:
+  //    [1, 2, ..., M] for the M parameters.
+  //    [0, -1, -2, ... -(N-1)] for the N [LocalVariable]s
+  // See (runtime/vm/scopes.h)
+  return variable_index <= 0 ? (variable_index + kFirstLocalSlotFromFp)
+                             : (variable_index + kParamEndSlotFromFp);
+}
+
+intptr_t VariableIndexForFrameSlot(intptr_t frame_slot) {
+  if (frame_slot <= kFirstLocalSlotFromFp) {
+    return frame_slot - kFirstLocalSlotFromFp;
+  } else {
+    ASSERT(frame_slot > kParamEndSlotFromFp);
+    return frame_slot - kParamEndSlotFromFp;
+  }
+}
+
 bool StackFrame::IsStubFrame() const {
+  if (is_interpreted()) {
+    return false;
+  }
   ASSERT(!(IsEntryFrame() || IsExitFrame()));
 #if !defined(HOST_OS_WINDOWS) && !defined(HOST_OS_FUCHSIA)
   // On Windows and Fuchsia, the profiler calls this from a separate thread
@@ -116,6 +147,9 @@
     map = code.GetStackMap(pc() - start, &maps, &map);
     if (!map.IsNull()) {
 #if !defined(TARGET_ARCH_DBC)
+      if (is_interpreted()) {
+        UNIMPLEMENTED();
+      }
       RawObject** first = reinterpret_cast<RawObject**>(sp());
       RawObject** last = reinterpret_cast<RawObject**>(
           fp() + (kFirstLocalSlotFromFp * kWordSize));
@@ -204,9 +238,10 @@
 #if !defined(TARGET_ARCH_DBC)
   // For normal unoptimized Dart frames and Stub frames each slot
   // between the first and last included are tagged objects.
-  RawObject** first = reinterpret_cast<RawObject**>(sp());
+  RawObject** first = reinterpret_cast<RawObject**>(
+      is_interpreted() ? fp() + (kKBCFirstObjectSlotFromFp * kWordSize) : sp());
   RawObject** last = reinterpret_cast<RawObject**>(
-      fp() + (kFirstObjectSlotFromFp * kWordSize));
+      is_interpreted() ? sp() : fp() + (kFirstObjectSlotFromFp * kWordSize));
 #else
   // On DBC stack grows upwards: fp() <= sp().
   RawObject** first = reinterpret_cast<RawObject**>(
@@ -250,8 +285,10 @@
 }
 
 RawCode* StackFrame::UncheckedGetCodeObject() const {
-  return *(
-      reinterpret_cast<RawCode**>(fp() + (kPcMarkerSlotFromFp * kWordSize)));
+  return *(reinterpret_cast<RawCode**>(
+      fp() +
+      ((is_interpreted() ? kKBCPcMarkerSlotFromFp : kPcMarkerSlotFromFp) *
+       kWordSize)));
 }
 
 bool StackFrame::FindExceptionHandler(Thread* thread,
@@ -332,14 +369,23 @@
   ASSERT(thread_ != NULL);
   uword exit_marker = thread_->top_exit_frame_info();
   frames_.fp_ = exit_marker;
+#if defined(DART_USE_INTERPRETER)
+  frames_.CheckIfInterpreted(exit_marker);
+#endif
 }
 
 void StackFrameIterator::SetupNextExitFrameData() {
-  uword exit_address = entry_.fp() + (kExitLinkSlotFromEntryFp * kWordSize);
+  uword exit_address =
+      entry_.fp() + ((entry_.is_interpreted() ? kKBCExitLinkSlotFromEntryFp
+                                              : kExitLinkSlotFromEntryFp) *
+                     kWordSize);
   uword exit_marker = *reinterpret_cast<uword*>(exit_address);
   frames_.fp_ = exit_marker;
   frames_.sp_ = 0;
   frames_.pc_ = 0;
+#if defined(DART_USE_INTERPRETER)
+  frames_.CheckIfInterpreted(exit_marker);
+#endif
 }
 
 // Tell MemorySanitizer that generated code initializes part of the stack.
@@ -379,6 +425,9 @@
   frames_.fp_ = last_fp;
   frames_.sp_ = 0;
   frames_.pc_ = 0;
+#if defined(DART_USE_INTERPRETER)
+  frames_.CheckIfInterpreted(last_fp);
+#endif
 }
 
 #if !defined(TARGET_ARCH_DBC)
@@ -399,6 +448,9 @@
   frames_.fp_ = fp;
   frames_.sp_ = sp;
   frames_.pc_ = pc;
+#if defined(DART_USE_INTERPRETER)
+  frames_.CheckIfInterpreted(fp);
+#endif
 }
 #endif
 
@@ -425,8 +477,10 @@
       // Iteration starts from an exit frame given by its fp.
       current_frame_ = NextExitFrame();
     } else if (*(reinterpret_cast<uword*>(
-                   frames_.fp_ + (kSavedCallerFpSlotFromFp * kWordSize))) ==
-               0) {
+                   frames_.fp_ +
+                   ((frames_.is_interpreted() ? kKBCSavedCallerFpSlotFromFp
+                                              : kSavedCallerFpSlotFromFp) *
+                    kWordSize))) == 0) {
       // Iteration starts from an entry frame given by its fp, sp, and pc.
       current_frame_ = NextEntryFrame();
     } else {
@@ -462,6 +516,16 @@
   return current_frame_;
 }
 
+#if defined(DART_USE_INTERPRETER)
+void StackFrameIterator::FrameSetIterator::CheckIfInterpreted(
+    uword exit_marker) {
+  // TODO(regis): Once the interpreter shares the native stack, we may rely on
+  // a new thread vm_tag to identify an interpreter frame.
+  Interpreter* interpreter = thread_->isolate()->interpreter();
+  is_interpreted_ = (interpreter != NULL) && interpreter->HasFrame(exit_marker);
+}
+#endif
+
 StackFrame* StackFrameIterator::FrameSetIterator::NextFrame(bool validate) {
   StackFrame* frame;
   ASSERT(HasNext());
@@ -469,9 +533,15 @@
   frame->sp_ = sp_;
   frame->fp_ = fp_;
   frame->pc_ = pc_;
+#if defined(DART_USE_INTERPRETER)
+  frame->is_interpreted_ = is_interpreted_;
+#endif
   sp_ = frame->GetCallerSp();
   fp_ = frame->GetCallerFp();
   pc_ = frame->GetCallerPc();
+#if defined(DART_USE_INTERPRETER)
+  ASSERT(is_interpreted_ == frame->is_interpreted_);
+#endif
   ASSERT(!validate || frame->IsValid());
   return frame;
 }
@@ -480,9 +550,15 @@
   exit_.sp_ = frames_.sp_;
   exit_.fp_ = frames_.fp_;
   exit_.pc_ = frames_.pc_;
+#if defined(DART_USE_INTERPRETER)
+  exit_.is_interpreted_ = frames_.is_interpreted_;
+#endif
   frames_.sp_ = exit_.GetCallerSp();
   frames_.fp_ = exit_.GetCallerFp();
   frames_.pc_ = exit_.GetCallerPc();
+#if defined(DART_USE_INTERPRETER)
+  ASSERT(frames_.is_interpreted_ == exit_.is_interpreted_);
+#endif
   ASSERT(!validate_ || exit_.IsValid());
   return &exit_;
 }
@@ -492,6 +568,9 @@
   entry_.sp_ = frames_.sp_;
   entry_.fp_ = frames_.fp_;
   entry_.pc_ = frames_.pc_;
+#if defined(DART_USE_INTERPRETER)
+  entry_.is_interpreted_ = frames_.is_interpreted_;
+#endif
   SetupNextExitFrameData();  // Setup data for next exit frame in chain.
   ASSERT(!validate_ || entry_.IsValid());
   return &entry_;
diff --git a/runtime/vm/stack_frame.h b/runtime/vm/stack_frame.h
index cfc3d71..8071323 100644
--- a/runtime/vm/stack_frame.h
+++ b/runtime/vm/stack_frame.h
@@ -6,7 +6,9 @@
 #define RUNTIME_VM_STACK_FRAME_H_
 
 #include "vm/allocation.h"
+#include "vm/interpreter.h"
 #include "vm/object.h"
+#include "vm/stack_frame_kbc.h"
 #include "vm/stub_code.h"
 
 #if defined(TARGET_ARCH_IA32)
@@ -28,6 +30,23 @@
 // Forward declarations.
 class ObjectPointerVisitor;
 class RawContext;
+class LocalVariable;
+
+// Returns the FP-relative index where [variable] can be found (assumes
+// [variable] is not captured), in words.
+intptr_t FrameSlotForVariable(const LocalVariable* variable);
+
+// Returns the FP-relative index where [variable] can be found (assumes
+// [variable] is not captured), in bytes.
+intptr_t FrameOffsetInBytesForVariable(const LocalVariable* variable);
+
+// Returns the FP-relative index where [variable_index] can be found (assumes
+// [variable_index] comes from a [LocalVariable::index()], which is not
+// captured).
+intptr_t FrameSlotForVariableIndex(intptr_t variable_index);
+
+// Returns the variable index from a FP-relative index.
+intptr_t VariableIndexForFrameSlot(intptr_t frame_slot);
 
 // Generic stack frame.
 class StackFrame : public ValueObject {
@@ -41,6 +60,7 @@
 
   // The pool pointer is not implemented on all architectures.
   static int SavedCallerPpSlotFromFp() {
+    // Never called on an interpreter frame.
     if (kSavedCallerPpSlotFromFp != kSavedCallerFpSlotFromFp) {
       return kSavedCallerPpSlotFromFp;
     }
@@ -49,17 +69,20 @@
   }
 
   uword IsMarkedForLazyDeopt() const {
+    ASSERT(!is_interpreted());
     uword raw_pc =
         *reinterpret_cast<uword*>(sp() + (kSavedPcSlotFromSp * kWordSize));
     return raw_pc == StubCode::DeoptimizeLazyFromReturn_entry()->EntryPoint();
   }
   void MarkForLazyDeopt() {
+    ASSERT(!is_interpreted());
     set_pc(StubCode::DeoptimizeLazyFromReturn_entry()->EntryPoint());
   }
   void UnmarkForLazyDeopt() {
     // If this frame was marked for lazy deopt, pc_ was computed to be the
     // original return address using the pending deopts table in GetCallerPc.
     // Write this value back into the frame.
+    ASSERT(!is_interpreted());
     uword original_pc = pc();
     ASSERT(original_pc !=
            StubCode::DeoptimizeLazyFromReturn_entry()->EntryPoint());
@@ -67,13 +90,17 @@
   }
 
   void set_pc(uword value) {
-    *reinterpret_cast<uword*>(sp() + (kSavedPcSlotFromSp * kWordSize)) = value;
+    *reinterpret_cast<uword*>(sp() + ((is_interpreted() ? kKBCSavedPcSlotFromSp
+                                                        : kSavedPcSlotFromSp) *
+                                      kWordSize)) = value;
     pc_ = value;
   }
 
   void set_pc_marker(RawCode* code) {
-    *reinterpret_cast<RawCode**>(fp() + (kPcMarkerSlotFromFp * kWordSize)) =
-        code;
+    *reinterpret_cast<RawCode**>(
+        fp() +
+        ((is_interpreted() ? kKBCPcMarkerSlotFromFp : kPcMarkerSlotFromFp) *
+         kWordSize)) = code;
   }
 
   // Visit objects in the frame.
@@ -92,6 +119,11 @@
   virtual bool IsStubFrame() const;
   virtual bool IsEntryFrame() const { return false; }
   virtual bool IsExitFrame() const { return false; }
+#if defined(DART_USE_INTERPRETER)
+  virtual bool is_interpreted() const { return is_interpreted_; }
+#else
+  virtual bool is_interpreted() const { return false; }
+#endif
 
   RawFunction* LookupDartFunction() const;
   RawCode* LookupDartCode() const;
@@ -105,7 +137,13 @@
 
  protected:
   explicit StackFrame(Thread* thread)
-      : fp_(0), sp_(0), pc_(0), thread_(thread) {}
+#if defined(DART_USE_INTERPRETER)
+      : fp_(0), sp_(0), pc_(0), thread_(thread), is_interpreted_(false) {
+  }
+#else
+      : fp_(0), sp_(0), pc_(0), thread_(thread) {
+  }
+#endif
 
   // Name of the frame, used for generic frame printing functionality.
   virtual const char* GetName() const {
@@ -120,16 +158,24 @@
   RawCode* GetCodeObject() const;
   RawCode* UncheckedGetCodeObject() const;
 
-  uword GetCallerSp() const { return fp() + (kCallerSpSlotFromFp * kWordSize); }
+  uword GetCallerSp() const {
+    return fp() +
+           ((is_interpreted() ? kKBCCallerSpSlotFromFp : kCallerSpSlotFromFp) *
+            kWordSize);
+  }
 
   uword GetCallerFp() const {
-    return *(reinterpret_cast<uword*>(fp() +
-                                      (kSavedCallerFpSlotFromFp * kWordSize)));
+    return *(reinterpret_cast<uword*>(
+        fp() + ((is_interpreted() ? kKBCSavedCallerFpSlotFromFp
+                                  : kSavedCallerFpSlotFromFp) *
+                kWordSize)));
   }
 
   uword GetCallerPc() const {
     uword raw_pc = *(reinterpret_cast<uword*>(
-        fp() + (kSavedCallerPcSlotFromFp * kWordSize)));
+        fp() + ((is_interpreted() ? kKBCSavedCallerPcSlotFromFp
+                                  : kSavedCallerPcSlotFromFp) *
+                kWordSize)));
     ASSERT(raw_pc != StubCode::DeoptimizeLazyFromThrow_entry()->EntryPoint());
     if (raw_pc == StubCode::DeoptimizeLazyFromReturn_entry()->EntryPoint()) {
       return isolate()->FindPendingDeopt(GetCallerFp());
@@ -141,6 +187,9 @@
   uword sp_;
   uword pc_;
   Thread* thread_;
+#if defined(DART_USE_INTERPRETER)
+  bool is_interpreted_;
+#endif
 
   // The iterators FrameSetIterator and StackFrameIterator set the private
   // fields fp_ and sp_ when they return the respective frame objects.
@@ -176,7 +225,9 @@
 // dart code.
 class EntryFrame : public StackFrame {
  public:
-  bool IsValid() const { return StubCode::InInvocationStub(pc()); }
+  bool IsValid() const {
+    return StubCode::InInvocationStub(pc(), is_interpreted());
+  }
   bool IsDartFrame(bool validate = true) const { return false; }
   bool IsStubFrame() const { return false; }
   bool IsEntryFrame() const { return true; }
@@ -245,22 +296,41 @@
       if (fp_ == 0) {
         return false;
       }
-      const uword pc =
-          *(reinterpret_cast<uword*>(sp_ + (kSavedPcSlotFromSp * kWordSize)));
-      return !StubCode::InInvocationStub(pc);
+      const uword pc = *(reinterpret_cast<uword*>(
+          sp_ +
+          ((is_interpreted() ? kKBCSavedPcSlotFromSp : kSavedPcSlotFromSp) *
+           kWordSize)));
+      return !StubCode::InInvocationStub(pc, is_interpreted());
     }
 
     // Get next non entry/exit frame in the set (assumes a next frame exists).
     StackFrame* NextFrame(bool validate);
 
    private:
+#if defined(DART_USE_INTERPRETER)
+    explicit FrameSetIterator(Thread* thread)
+        : fp_(0),
+          sp_(0),
+          pc_(0),
+          stack_frame_(thread),
+          thread_(thread),
+          is_interpreted_(false) {}
+    bool is_interpreted() const { return is_interpreted_; }
+    void CheckIfInterpreted(uword exit_marker);
+#else
     explicit FrameSetIterator(Thread* thread)
         : fp_(0), sp_(0), pc_(0), stack_frame_(thread), thread_(thread) {}
+    bool is_interpreted() const { return false; }
+#endif
+
     uword fp_;
     uword sp_;
     uword pc_;
     StackFrame stack_frame_;  // Singleton frame returned by NextFrame().
     Thread* thread_;
+#if defined(DART_USE_INTERPRETER)
+    bool is_interpreted_;
+#endif
 
     friend class StackFrameIterator;
     DISALLOW_COPY_AND_ASSIGN(FrameSetIterator);
@@ -281,6 +351,10 @@
   void SetupLastExitFrameData();
   void SetupNextExitFrameData();
 
+#if defined(DART_USE_INTERPRETER)
+  void CheckInterpreterExitFrame(uword exit_marker);
+#endif
+
   bool validate_;     // Validate each frame as we traverse the frames.
   EntryFrame entry_;  // Singleton entry frame returned by NextEntryFrame().
   ExitFrame exit_;    // Singleton exit frame returned by NextExitFrame().
diff --git a/runtime/vm/stack_frame_dbc.h b/runtime/vm/stack_frame_dbc.h
index 64a7cb3..475d9b7 100644
--- a/runtime/vm/stack_frame_dbc.h
+++ b/runtime/vm/stack_frame_dbc.h
@@ -58,7 +58,6 @@
 
 DART_FORCE_INLINE static intptr_t LocalVarIndex(intptr_t fp_offset,
                                                 intptr_t var_index) {
-  ASSERT(var_index != 0);
   if (var_index > 0) {
     return fp_offset - var_index;
   } else {
diff --git a/runtime/vm/stack_frame_kbc.h b/runtime/vm/stack_frame_kbc.h
index c4e81b5..73ca527 100644
--- a/runtime/vm/stack_frame_kbc.h
+++ b/runtime/vm/stack_frame_kbc.h
@@ -42,7 +42,6 @@
 static const int kKBCLastFixedObjectSlotFromFp = -3;
 
 static const int kKBCSavedCallerFpSlotFromFp = -1;
-static const int kKBCSavedCallerPpSlotFromFp = kKBCSavedCallerFpSlotFromFp;
 static const int kKBCSavedCallerPcSlotFromFp = -2;
 static const int kKBCCallerSpSlotFromFp = -kKBCDartFrameFixedSize - 1;
 static const int kKBCPcMarkerSlotFromFp = -3;
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index a664808..05baaee 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -86,12 +86,27 @@
   return StubCode::AsynchronousGapMarker_entry() != NULL;
 }
 
-bool StubCode::InInvocationStub(uword pc) {
+bool StubCode::InInvocationStub(uword pc, bool is_interpreted_frame) {
 #if !defined(TARGET_ARCH_DBC)
   ASSERT(HasBeenInitialized());
+#if defined(DART_USE_INTERPRETER)
+  // Recognize special marker set up by interpreter in entry frame.
+  if (is_interpreted_frame && (pc & 2) != 0) {
+    return true;
+  }
+  {
+    uword entry = StubCode::InvokeDartCodeFromBytecode_entry()->EntryPoint();
+    uword size = StubCode::InvokeDartCodeFromBytecodeSize();
+    if ((pc >= entry) && (pc < (entry + size))) {
+      return true;
+    }
+  }
+#endif
   uword entry = StubCode::InvokeDartCode_entry()->EntryPoint();
   uword size = StubCode::InvokeDartCodeSize();
   return (pc >= entry) && (pc < (entry + size));
+#elif defined(DART_USE_INTERPRETER)
+#error "Simultaneous usage of simulator and interpreter not yet supported."
 #else
   // On DBC we use a special marker PC to signify entry frame because there is
   // no such thing as invocation stub.
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index b6c1c3c..1f836fb 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -147,7 +147,7 @@
 
   // Check if specified pc is in the dart invocation stub used for
   // transitioning into dart code.
-  static bool InInvocationStub(uword pc);
+  static bool InInvocationStub(uword pc, bool is_interpreted_frame);
 
   // Check if the specified pc is in the jump to frame stub.
   static bool InJumpToFrameStub(uword pc);
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 6aa0494..70e9cb6 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -2177,13 +2177,12 @@
 // checks for boxed numbers.
 // LR: return address.
 // Return Zero condition flag set if equal.
-// Note: A Mint cannot contain a value that would fit in Smi, a Bigint
-// cannot contain a value that fits in Mint or Smi.
+// Note: A Mint cannot contain a value that would fit in Smi.
 static void GenerateIdenticalWithNumberCheckStub(Assembler* assembler,
                                                  const Register left,
                                                  const Register right,
                                                  const Register temp) {
-  Label reference_compare, done, check_mint, check_bigint;
+  Label reference_compare, done, check_mint;
   // If any of the arguments is Smi do reference compare.
   __ tst(left, Operand(kSmiTagMask));
   __ b(&reference_compare, EQ);
@@ -2208,7 +2207,7 @@
 
   __ Bind(&check_mint);
   __ CompareClassId(left, kMintCid, temp);
-  __ b(&check_bigint, NE);
+  __ b(&reference_compare, NE);
   __ CompareClassId(right, kMintCid, temp);
   __ b(&done, NE);
   __ ldr(temp, FieldAddress(left, Mint::value_offset() + 0 * kWordSize));
@@ -2220,20 +2219,6 @@
   __ cmp(temp, Operand(IP));
   __ b(&done);
 
-  __ Bind(&check_bigint);
-  __ CompareClassId(left, kBigintCid, temp);
-  __ b(&reference_compare, NE);
-  __ CompareClassId(right, kBigintCid, temp);
-  __ b(&done, NE);
-  __ EnterStubFrame();
-  __ ReserveAlignedFrameSpace(2 * kWordSize);
-  __ stm(IA, SP, (1 << R0) | (1 << R1));
-  __ CallRuntime(kBigintCompareRuntimeEntry, 2);
-  // Result in R0, 0 means equal.
-  __ LeaveStubFrame();
-  __ cmp(R0, Operand(0));
-  __ b(&done);
-
   __ Bind(&reference_compare);
   __ cmp(left, Operand(right));
   __ Bind(&done);
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 5d07eb1..b7c6f15 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -2227,12 +2227,11 @@
 // checks for boxed numbers.
 // Left and right are pushed on stack.
 // Return Zero condition flag set if equal.
-// Note: A Mint cannot contain a value that would fit in Smi, a Bigint
-// cannot contain a value that fits in Mint or Smi.
+// Note: A Mint cannot contain a value that would fit in Smi.
 static void GenerateIdenticalWithNumberCheckStub(Assembler* assembler,
                                                  const Register left,
                                                  const Register right) {
-  Label reference_compare, done, check_mint, check_bigint;
+  Label reference_compare, done, check_mint;
   // If any of the arguments is Smi do reference compare.
   __ BranchIfSmi(left, &reference_compare);
   __ BranchIfSmi(right, &reference_compare);
@@ -2250,27 +2249,11 @@
 
   __ Bind(&check_mint);
   __ CompareClassId(left, kMintCid);
-  __ b(&check_bigint, NE);
+  __ b(&reference_compare, NE);
   __ CompareClassId(right, kMintCid);
   __ b(&done, NE);
   __ LoadFieldFromOffset(left, left, Mint::value_offset());
   __ LoadFieldFromOffset(right, right, Mint::value_offset());
-  __ b(&reference_compare);
-
-  __ Bind(&check_bigint);
-  __ CompareClassId(left, kBigintCid);
-  __ b(&reference_compare, NE);
-  __ CompareClassId(right, kBigintCid);
-  __ b(&done, NE);
-  __ EnterStubFrame();
-  __ ReserveAlignedFrameSpace(2 * kWordSize);
-  __ StoreToOffset(left, SP, 0 * kWordSize);
-  __ StoreToOffset(right, SP, 1 * kWordSize);
-  __ CallRuntime(kBigintCompareRuntimeEntry, 2);
-  // Result in R0, 0 means equal.
-  __ LeaveStubFrame();
-  __ cmp(R0, Operand(0));
-  __ b(&done);
 
   __ Bind(&reference_compare);
   __ CompareRegisters(left, right);
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index ae5b070..bae80ce 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -1903,13 +1903,12 @@
 // Does identical check (object references are equal or not equal) with special
 // checks for boxed numbers.
 // Return ZF set.
-// Note: A Mint cannot contain a value that would fit in Smi, a Bigint
-// cannot contain a value that fits in Mint or Smi.
+// Note: A Mint cannot contain a value that would fit in Smi.
 static void GenerateIdenticalWithNumberCheckStub(Assembler* assembler,
                                                  const Register left,
                                                  const Register right,
                                                  const Register temp) {
-  Label reference_compare, done, check_mint, check_bigint;
+  Label reference_compare, done, check_mint;
   // If any of the arguments is Smi do reference compare.
   __ testl(left, Immediate(kSmiTagMask));
   __ j(ZERO, &reference_compare, Assembler::kNearJump);
@@ -1932,7 +1931,7 @@
 
   __ Bind(&check_mint);
   __ CompareClassId(left, kMintCid, temp);
-  __ j(NOT_EQUAL, &check_bigint, Assembler::kNearJump);
+  __ j(NOT_EQUAL, &reference_compare, Assembler::kNearJump);
   __ CompareClassId(right, kMintCid, temp);
   __ j(NOT_EQUAL, &done, Assembler::kNearJump);
   __ movl(temp, FieldAddress(left, Mint::value_offset() + 0 * kWordSize));
@@ -1942,21 +1941,6 @@
   __ cmpl(temp, FieldAddress(right, Mint::value_offset() + 1 * kWordSize));
   __ jmp(&done, Assembler::kNearJump);
 
-  __ Bind(&check_bigint);
-  __ CompareClassId(left, kBigintCid, temp);
-  __ j(NOT_EQUAL, &reference_compare, Assembler::kNearJump);
-  __ CompareClassId(right, kBigintCid, temp);
-  __ j(NOT_EQUAL, &done, Assembler::kNearJump);
-  __ EnterFrame(0);
-  __ ReserveAlignedFrameSpace(2 * kWordSize);
-  __ movl(Address(ESP, 1 * kWordSize), left);
-  __ movl(Address(ESP, 0 * kWordSize), right);
-  __ CallRuntime(kBigintCompareRuntimeEntry, 2);
-  // Result in EAX, 0 means equal.
-  __ LeaveFrame();
-  __ cmpl(EAX, Immediate(0));
-  __ jmp(&done);
-
   __ Bind(&reference_compare);
   __ cmpl(left, right);
   __ Bind(&done);
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index c5d5151..532a4ea 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -2336,12 +2336,11 @@
 // checks for boxed numbers.
 // Left and right are pushed on stack.
 // Return ZF set.
-// Note: A Mint cannot contain a value that would fit in Smi, a Bigint
-// cannot contain a value that fits in Mint or Smi.
+// Note: A Mint cannot contain a value that would fit in Smi.
 static void GenerateIdenticalWithNumberCheckStub(Assembler* assembler,
                                                  const Register left,
                                                  const Register right) {
-  Label reference_compare, done, check_mint, check_bigint;
+  Label reference_compare, done, check_mint;
   // If any of the arguments is Smi do reference compare.
   __ testq(left, Immediate(kSmiTagMask));
   __ j(ZERO, &reference_compare);
@@ -2361,28 +2360,13 @@
 
   __ Bind(&check_mint);
   __ CompareClassId(left, kMintCid);
-  __ j(NOT_EQUAL, &check_bigint, Assembler::kNearJump);
+  __ j(NOT_EQUAL, &reference_compare, Assembler::kNearJump);
   __ CompareClassId(right, kMintCid);
   __ j(NOT_EQUAL, &done, Assembler::kFarJump);
   __ movq(left, FieldAddress(left, Mint::value_offset()));
   __ cmpq(left, FieldAddress(right, Mint::value_offset()));
   __ jmp(&done, Assembler::kFarJump);
 
-  __ Bind(&check_bigint);
-  __ CompareClassId(left, kBigintCid);
-  __ j(NOT_EQUAL, &reference_compare, Assembler::kFarJump);
-  __ CompareClassId(right, kBigintCid);
-  __ j(NOT_EQUAL, &done, Assembler::kFarJump);
-  __ EnterStubFrame();
-  __ ReserveAlignedFrameSpace(0);
-  __ movq(CallingConventions::kArg1Reg, left);
-  __ movq(CallingConventions::kArg2Reg, right);
-  __ CallRuntime(kBigintCompareRuntimeEntry, 2);
-  // Result in RAX, 0 means equal.
-  __ LeaveStubFrame();
-  __ cmpq(RAX, Immediate(0));
-  __ jmp(&done);
-
   __ Bind(&reference_compare);
   __ cmpq(left, right);
   __ Bind(&done);
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 4613aff..50e5b36 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -213,7 +213,6 @@
   V(Number, "num")                                                             \
   V(_Smi, "_Smi")                                                              \
   V(_Mint, "_Mint")                                                            \
-  V(_Bigint, "_Bigint")                                                        \
   V(_Double, "_Double")                                                        \
   V(Bool, "bool")                                                              \
   V(_List, "_List")                                                            \
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index aec2bf7..7f1c0d3 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -390,14 +390,6 @@
   store_buffer_block_ = isolate()->store_buffer()->PopEmptyBlock();
 }
 
-void Thread::SetStackLimitFromStackBase(uword stack_base) {
-#if defined(USING_SIMULATOR)
-  SetStackLimit(Simulator::Current()->stack_limit());
-#else
-  SetStackLimit(OSThread::Current()->stack_limit_with_headroom());
-#endif
-}
-
 void Thread::SetStackLimit(uword limit) {
   // The thread setting the stack limit is not necessarily the thread which
   // the stack limit is being set on.
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index 063c4ef..d524b9d 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -221,7 +221,6 @@
   void PrepareForGC();
 
   void SetStackLimit(uword value);
-  void SetStackLimitFromStackBase(uword stack_base);
   void ClearStackLimit();
 
   // Access to the current stack limit for generated code.  This may be
diff --git a/runtime/vm/thread_interrupter_fuchsia.cc b/runtime/vm/thread_interrupter_fuchsia.cc
index 26409ca..375f98d 100644
--- a/runtime/vm/thread_interrupter_fuchsia.cc
+++ b/runtime/vm/thread_interrupter_fuchsia.cc
@@ -174,6 +174,11 @@
 
  private:
   static const char* ThreadStateGetString(uint32_t state) {
+// TODO(dje): This #ifdef is temporary to handle the transition.
+// It can be deleted once the new version of zircon rolls out.
+#ifdef ZX_THREAD_STATE_BASIC
+    state = ZX_THREAD_STATE_BASIC(state);
+#endif
     switch (state) {
       case ZX_THREAD_STATE_NEW:
         return "ZX_THREAD_STATE_NEW";
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index bbf3561..a88106a 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -689,10 +689,6 @@
   return Api::Success();
 }
 
-char* TestCase::BigintToHexValue(Dart_CObject* bigint) {
-  return bin::CObject::BigintToHexValue(bigint);
-}
-
 #if !defined(PRODUCT)
 static bool IsHex(int c) {
   return ('0' <= c && c <= '9') || ('a' <= c && c <= 'f');
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index d3f2870..ee2c328 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -361,7 +361,6 @@
   static Dart_Handle library_handler(Dart_LibraryTag tag,
                                      Dart_Handle library,
                                      Dart_Handle url);
-  static char* BigintToHexValue(Dart_CObject* bigint);
 
   virtual void Run();
 
diff --git a/runtime/vm/vm_sources.gni b/runtime/vm/vm_sources.gni
index f15b129..d227772 100644
--- a/runtime/vm/vm_sources.gni
+++ b/runtime/vm/vm_sources.gni
@@ -13,6 +13,8 @@
   "ast_printer.h",
   "ast_transformer.cc",
   "ast_transformer.h",
+  "base64.cc",
+  "base64.h",
   "base_isolate.h",
   "become.cc",
   "become.h",
@@ -385,7 +387,7 @@
   "atomic_test.cc",
   "benchmark_test.cc",
   "benchmark_test.h",
-  "bigint_test.cc",
+  "base64_test.cc",
   "bit_set_test.cc",
   "bit_vector_test.cc",
   "bitfield_test.cc",
diff --git a/sdk/lib/_http/http.dart b/sdk/lib/_http/http.dart
index 1cb1b53..fa90619 100644
--- a/sdk/lib/_http/http.dart
+++ b/sdk/lib/_http/http.dart
@@ -34,50 +34,138 @@
  * HTTP status codes.
  */
 abstract class HttpStatus {
-  static const int CONTINUE = 100;
-  static const int SWITCHING_PROTOCOLS = 101;
-  static const int OK = 200;
-  static const int CREATED = 201;
-  static const int ACCEPTED = 202;
-  static const int NON_AUTHORITATIVE_INFORMATION = 203;
-  static const int NO_CONTENT = 204;
-  static const int RESET_CONTENT = 205;
-  static const int PARTIAL_CONTENT = 206;
-  static const int MULTIPLE_CHOICES = 300;
-  static const int MOVED_PERMANENTLY = 301;
-  static const int FOUND = 302;
-  static const int MOVED_TEMPORARILY = 302; // Common alias for FOUND.
-  static const int SEE_OTHER = 303;
-  static const int NOT_MODIFIED = 304;
-  static const int USE_PROXY = 305;
-  static const int TEMPORARY_REDIRECT = 307;
-  static const int BAD_REQUEST = 400;
-  static const int UNAUTHORIZED = 401;
-  static const int PAYMENT_REQUIRED = 402;
-  static const int FORBIDDEN = 403;
-  static const int NOT_FOUND = 404;
-  static const int METHOD_NOT_ALLOWED = 405;
-  static const int NOT_ACCEPTABLE = 406;
-  static const int PROXY_AUTHENTICATION_REQUIRED = 407;
-  static const int REQUEST_TIMEOUT = 408;
-  static const int CONFLICT = 409;
-  static const int GONE = 410;
-  static const int LENGTH_REQUIRED = 411;
-  static const int PRECONDITION_FAILED = 412;
-  static const int REQUEST_ENTITY_TOO_LARGE = 413;
-  static const int REQUEST_URI_TOO_LONG = 414;
-  static const int UNSUPPORTED_MEDIA_TYPE = 415;
-  static const int REQUESTED_RANGE_NOT_SATISFIABLE = 416;
-  static const int EXPECTATION_FAILED = 417;
-  static const int UPGRADE_REQUIRED = 426;
-  static const int INTERNAL_SERVER_ERROR = 500;
-  static const int NOT_IMPLEMENTED = 501;
-  static const int BAD_GATEWAY = 502;
-  static const int SERVICE_UNAVAILABLE = 503;
-  static const int GATEWAY_TIMEOUT = 504;
-  static const int HTTP_VERSION_NOT_SUPPORTED = 505;
+  static const int continue_ = 100;
+  static const int switchingProtocols = 101;
+  static const int ok = 200;
+  static const int created = 201;
+  static const int accepted = 202;
+  static const int nonAuthoritativeInformation = 203;
+  static const int noContent = 204;
+  static const int resetContent = 205;
+  static const int partialContent = 206;
+  static const int multipleChoices = 300;
+  static const int movedPermanently = 301;
+  static const int found = 302;
+  static const int movedTemporarily = 302; // Common alias for found.
+  static const int seeOther = 303;
+  static const int notModified = 304;
+  static const int useProxy = 305;
+  static const int temporaryRedirect = 307;
+  static const int badRequest = 400;
+  static const int unauthorized = 401;
+  static const int paymentRequired = 402;
+  static const int forbidden = 403;
+  static const int notFound = 404;
+  static const int methodNotAllowed = 405;
+  static const int notAcceptable = 406;
+  static const int proxyAuthenticationRequired = 407;
+  static const int requestTimeout = 408;
+  static const int conflict = 409;
+  static const int gone = 410;
+  static const int lengthRequired = 411;
+  static const int preconditionFailed = 412;
+  static const int requestEntityTooLarge = 413;
+  static const int requestUriTooLong = 414;
+  static const int unsupportedMediaType = 415;
+  static const int requestedRangeNotSatisfiable = 416;
+  static const int expectationFailed = 417;
+  static const int upgradeRequired = 426;
+  static const int internalServerError = 500;
+  static const int notImplemented = 501;
+  static const int badGateway = 502;
+  static const int serviceUnavailable = 503;
+  static const int gatewayTimeout = 504;
+  static const int httpVersionNotSupported = 505;
   // Client generated status code.
-  static const int NETWORK_CONNECT_TIMEOUT_ERROR = 599;
+  static const int networkConnectTimeoutError = 599;
+
+  @Deprecated("Use continue_ instead")
+  static const int CONTINUE = continue_;
+  @Deprecated("Use switchingProtocols instead")
+  static const int SWITCHING_PROTOCOLS = switchingProtocols;
+  @Deprecated("Use ok instead")
+  static const int OK = ok;
+  @Deprecated("Use created instead")
+  static const int CREATED = created;
+  @Deprecated("Use accepted instead")
+  static const int ACCEPTED = accepted;
+  @Deprecated("Use nonAuthoritativeInformation instead")
+  static const int NON_AUTHORITATIVE_INFORMATION = nonAuthoritativeInformation;
+  @Deprecated("Use noContent instead")
+  static const int NO_CONTENT = noContent;
+  @Deprecated("Use resetContent instead")
+  static const int RESET_CONTENT = resetContent;
+  @Deprecated("Use partialContent instead")
+  static const int PARTIAL_CONTENT = partialContent;
+  @Deprecated("Use multipleChoices instead")
+  static const int MULTIPLE_CHOICES = multipleChoices;
+  @Deprecated("Use movedPermanently instead")
+  static const int MOVED_PERMANENTLY = movedPermanently;
+  @Deprecated("Use found instead")
+  static const int FOUND = found;
+  @Deprecated("Use movedTemporarily instead")
+  static const int MOVED_TEMPORARILY = movedTemporarily;
+  @Deprecated("Use seeOther instead")
+  static const int SEE_OTHER = seeOther;
+  @Deprecated("Use notModified instead")
+  static const int NOT_MODIFIED = notModified;
+  @Deprecated("Use useProxy instead")
+  static const int USE_PROXY = useProxy;
+  @Deprecated("Use temporaryRedirect instead")
+  static const int TEMPORARY_REDIRECT = temporaryRedirect;
+  @Deprecated("Use badRequest instead")
+  static const int BAD_REQUEST = badRequest;
+  @Deprecated("Use unauthorized instead")
+  static const int UNAUTHORIZED = unauthorized;
+  @Deprecated("Use paymentRequired instead")
+  static const int PAYMENT_REQUIRED = paymentRequired;
+  @Deprecated("Use forbidden instead")
+  static const int FORBIDDEN = forbidden;
+  @Deprecated("Use notFound instead")
+  static const int NOT_FOUND = notFound;
+  @Deprecated("Use methodNotAllowed instead")
+  static const int METHOD_NOT_ALLOWED = methodNotAllowed;
+  @Deprecated("Use notAcceptable instead")
+  static const int NOT_ACCEPTABLE = notAcceptable;
+  @Deprecated("Use proxyAuthenticationRequired instead")
+  static const int PROXY_AUTHENTICATION_REQUIRED = proxyAuthenticationRequired;
+  @Deprecated("Use requestTimeout instead")
+  static const int REQUEST_TIMEOUT = requestTimeout;
+  @Deprecated("Use conflict instead")
+  static const int CONFLICT = conflict;
+  @Deprecated("Use gone instead")
+  static const int GONE = gone;
+  @Deprecated("Use lengthRequired instead")
+  static const int LENGTH_REQUIRED = lengthRequired;
+  @Deprecated("Use preconditionFailed instead")
+  static const int PRECONDITION_FAILED = preconditionFailed;
+  @Deprecated("Use requestEntityTooLarge instead")
+  static const int REQUEST_ENTITY_TOO_LARGE = requestEntityTooLarge;
+  @Deprecated("Use requestUriTooLong instead")
+  static const int REQUEST_URI_TOO_LONG = requestUriTooLong;
+  @Deprecated("Use unsupportedMediaType instead")
+  static const int UNSUPPORTED_MEDIA_TYPE = unsupportedMediaType;
+  @Deprecated("Use requestedRangeNotSatisfiable instead")
+  static const int REQUESTED_RANGE_NOT_SATISFIABLE =
+      requestedRangeNotSatisfiable;
+  @Deprecated("Use expectationFailed instead")
+  static const int EXPECTATION_FAILED = expectationFailed;
+  @Deprecated("Use upgradeRequired instead")
+  static const int UPGRADE_REQUIRED = upgradeRequired;
+  @Deprecated("Use internalServerError instead")
+  static const int INTERNAL_SERVER_ERROR = internalServerError;
+  @Deprecated("Use notImplemented instead")
+  static const int NOT_IMPLEMENTED = notImplemented;
+  @Deprecated("Use badGateway instead")
+  static const int BAD_GATEWAY = badGateway;
+  @Deprecated("Use serviceUnavailable instead")
+  static const int SERVICE_UNAVAILABLE = serviceUnavailable;
+  @Deprecated("Use gatewayTimeout instead")
+  static const int GATEWAY_TIMEOUT = gatewayTimeout;
+  @Deprecated("Use httpVersionNotSupported instead")
+  static const int HTTP_VERSION_NOT_SUPPORTED = httpVersionNotSupported;
+  @Deprecated("Use networkConnectTimeoutError instead")
+  static const int NETWORK_CONNECT_TIMEOUT_ERROR = networkConnectTimeoutError;
 }
 
 /**
@@ -97,7 +185,7 @@
  *
  *     main() {
  *       HttpServer
- *           .bind(InternetAddress.ANY_IP_V6, 80)
+ *           .bind(InternetAddress.anyIPv6, 80)
  *           .then((server) {
  *             server.listen((HttpRequest request) {
  *               request.response.write('Hello, world!');
@@ -138,7 +226,7 @@
  *       context.usePrivateKey(key, password: 'dartdart');
  *
  *       HttpServer
- *           .bindSecure(InternetAddress.ANY_IP_V6,
+ *           .bindSecure(InternetAddress.anyIPv6,
  *                       443,
  *                       context)
  *           .then((server) {
@@ -160,7 +248,7 @@
  *     import 'dart:io';
  *
  *     main() {
- *       ServerSocket.bind(InternetAddress.ANY_IP_V6, 80)
+ *       ServerSocket.bind(InternetAddress.anyIPv6, 80)
  *         .then((serverSocket) {
  *           HttpServer httpserver = new HttpServer.listenOn(serverSocket);
  *           serverSocket.listen((Socket socket) {
@@ -242,17 +330,17 @@
    * perform a [InternetAddress.lookup] and use the first value in the
    * list. To listen on the loopback adapter, which will allow only
    * incoming connections from the local host, use the value
-   * [InternetAddress.LOOPBACK_IP_V4] or
-   * [InternetAddress.LOOPBACK_IP_V6]. To allow for incoming
+   * [InternetAddress.loopbackIPv4] or
+   * [InternetAddress.loopbackIPv6]. To allow for incoming
    * connection from the network use either one of the values
-   * [InternetAddress.ANY_IP_V4] or [InternetAddress.ANY_IP_V6] to
+   * [InternetAddress.anyIPv4] or [InternetAddress.anyIPv6] to
    * bind to all interfaces or the IP address of a specific interface.
    *
    * If an IP version 6 (IPv6) address is used, both IP version 6
    * (IPv6) and version 4 (IPv4) connections will be accepted. To
    * restrict this to version 6 (IPv6) only, use [v6Only] to set
    * version 6 only. However, if the address is
-   * [InternetAddress.LOOPBACK_IP_V6], only IP version 6 (IPv6) connections
+   * [InternetAddress.loopbackIPv6], only IP version 6 (IPv6) connections
    * will be accepted.
    *
    * If [port] has the value [:0:] an ephemeral port will be chosen by
@@ -281,10 +369,10 @@
    * perform a [InternetAddress.lookup] and use the first value in the
    * list. To listen on the loopback adapter, which will allow only
    * incoming connections from the local host, use the value
-   * [InternetAddress.LOOPBACK_IP_V4] or
-   * [InternetAddress.LOOPBACK_IP_V6]. To allow for incoming
+   * [InternetAddress.loopbackIPv4] or
+   * [InternetAddress.loopbackIPv6]. To allow for incoming
    * connection from the network use either one of the values
-   * [InternetAddress.ANY_IP_V4] or [InternetAddress.ANY_IP_V6] to
+   * [InternetAddress.anyIPv4] or [InternetAddress.anyIPv6] to
    * bind to all interfaces or the IP address of a specific interface.
    *
    * If an IP version 6 (IPv6) address is used, both IP version 6
@@ -415,12 +503,12 @@
  *
  * To set the value of a header use the `set()` method:
  *
- *     request.headers.set(HttpHeaders.CACHE_CONTROL,
+ *     request.headers.set(HttpHeaders.cacheControlHeader,
  *                         'max-age=3600, must-revalidate');
  *
  * To retrieve the value of a header use the `value()` method:
  *
- *     print(request.headers.value(HttpHeaders.USER_AGENT));
+ *     print(request.headers.value(HttpHeaders.userAgentHeader));
  *
  * An HttpHeaders object holds a list of values for each name
  * as the standard allows. In most cases a name holds only a single value,
@@ -428,117 +516,229 @@
  * and `value()` for retrieving a value.
  */
 abstract class HttpHeaders {
-  static const ACCEPT = "accept";
-  static const ACCEPT_CHARSET = "accept-charset";
-  static const ACCEPT_ENCODING = "accept-encoding";
-  static const ACCEPT_LANGUAGE = "accept-language";
-  static const ACCEPT_RANGES = "accept-ranges";
-  static const AGE = "age";
-  static const ALLOW = "allow";
-  static const AUTHORIZATION = "authorization";
-  static const CACHE_CONTROL = "cache-control";
-  static const CONNECTION = "connection";
-  static const CONTENT_ENCODING = "content-encoding";
-  static const CONTENT_LANGUAGE = "content-language";
-  static const CONTENT_LENGTH = "content-length";
-  static const CONTENT_LOCATION = "content-location";
-  static const CONTENT_MD5 = "content-md5";
-  static const CONTENT_RANGE = "content-range";
-  static const CONTENT_TYPE = "content-type";
-  static const DATE = "date";
-  static const ETAG = "etag";
-  static const EXPECT = "expect";
-  static const EXPIRES = "expires";
-  static const FROM = "from";
-  static const HOST = "host";
-  static const IF_MATCH = "if-match";
-  static const IF_MODIFIED_SINCE = "if-modified-since";
-  static const IF_NONE_MATCH = "if-none-match";
-  static const IF_RANGE = "if-range";
-  static const IF_UNMODIFIED_SINCE = "if-unmodified-since";
-  static const LAST_MODIFIED = "last-modified";
-  static const LOCATION = "location";
-  static const MAX_FORWARDS = "max-forwards";
-  static const PRAGMA = "pragma";
-  static const PROXY_AUTHENTICATE = "proxy-authenticate";
-  static const PROXY_AUTHORIZATION = "proxy-authorization";
-  static const RANGE = "range";
-  static const REFERER = "referer";
-  static const RETRY_AFTER = "retry-after";
-  static const SERVER = "server";
-  static const TE = "te";
-  static const TRAILER = "trailer";
-  static const TRANSFER_ENCODING = "transfer-encoding";
-  static const UPGRADE = "upgrade";
-  static const USER_AGENT = "user-agent";
-  static const VARY = "vary";
-  static const VIA = "via";
-  static const WARNING = "warning";
-  static const WWW_AUTHENTICATE = "www-authenticate";
+  static const acceptHeader = "accept";
+  static const acceptCharsetHeader = "accept-charset";
+  static const acceptEncodingHeader = "accept-encoding";
+  static const acceptLanguageHeader = "accept-language";
+  static const acceptRangesHeader = "accept-ranges";
+  static const ageHeader = "age";
+  static const allowHeader = "allow";
+  static const authorizationHeader = "authorization";
+  static const cacheControlHeader = "cache-control";
+  static const connectionHeader = "connection";
+  static const contentEncodingHeader = "content-encoding";
+  static const contentLanguageHeader = "content-language";
+  static const contentLengthHeader = "content-length";
+  static const contentLocationHeader = "content-location";
+  static const contentMD5Header = "content-md5";
+  static const contentRangeHeader = "content-range";
+  static const contentTypeHeader = "content-type";
+  static const dateHeader = "date";
+  static const etagHeader = "etag";
+  static const expectHeader = "expect";
+  static const expiresHeader = "expires";
+  static const fromHeader = "from";
+  static const hostHeader = "host";
+  static const ifMatchHeader = "if-match";
+  static const ifModifiedSinceHeader = "if-modified-since";
+  static const ifNoneMatchHeader = "if-none-match";
+  static const ifRangeHeader = "if-range";
+  static const ifUnmodifiedSinceHeader = "if-unmodified-since";
+  static const lastModifiedHeader = "last-modified";
+  static const locationHeader = "location";
+  static const maxForwardsHeader = "max-forwards";
+  static const pragmaHeader = "pragma";
+  static const proxyAuthenticateHeader = "proxy-authenticate";
+  static const proxyAuthorizationHeader = "proxy-authorization";
+  static const rangeHeader = "range";
+  static const refererHeader = "referer";
+  static const retryAfterHeader = "retry-after";
+  static const serverHeader = "server";
+  static const teHeader = "te";
+  static const trailerHeader = "trailer";
+  static const transferEncodingHeader = "transfer-encoding";
+  static const upgradeHeader = "upgrade";
+  static const userAgentHeader = "user-agent";
+  static const varyHeader = "vary";
+  static const viaHeader = "via";
+  static const warningHeader = "warning";
+  static const wwwAuthenticateHeader = "www-authenticate";
+
+  @Deprecated("Use acceptHeader instead")
+  static const ACCEPT = acceptHeader;
+  @Deprecated("Use acceptCharsetHeader instead")
+  static const ACCEPT_CHARSET = acceptCharsetHeader;
+  @Deprecated("Use acceptEncodingHeader instead")
+  static const ACCEPT_ENCODING = acceptEncodingHeader;
+  @Deprecated("Use acceptLanguageHeader instead")
+  static const ACCEPT_LANGUAGE = acceptLanguageHeader;
+  @Deprecated("Use acceptRangesHeader instead")
+  static const ACCEPT_RANGES = acceptRangesHeader;
+  @Deprecated("Use ageHeader instead")
+  static const AGE = ageHeader;
+  @Deprecated("Use allowHeader instead")
+  static const ALLOW = allowHeader;
+  @Deprecated("Use authorizationHeader instead")
+  static const AUTHORIZATION = authorizationHeader;
+  @Deprecated("Use cacheControlHeader instead")
+  static const CACHE_CONTROL = cacheControlHeader;
+  @Deprecated("Use connectionHeader instead")
+  static const CONNECTION = connectionHeader;
+  @Deprecated("Use contentEncodingHeader instead")
+  static const CONTENT_ENCODING = contentEncodingHeader;
+  @Deprecated("Use contentLanguageHeader instead")
+  static const CONTENT_LANGUAGE = contentLanguageHeader;
+  @Deprecated("Use contentLengthHeader instead")
+  static const CONTENT_LENGTH = contentLengthHeader;
+  @Deprecated("Use contentLocationHeader instead")
+  static const CONTENT_LOCATION = contentLocationHeader;
+  @Deprecated("Use contentMD5Header instead")
+  static const CONTENT_MD5 = contentMD5Header;
+  @Deprecated("Use contentRangeHeader instead")
+  static const CONTENT_RANGE = contentRangeHeader;
+  @Deprecated("Use contentTypeHeader instead")
+  static const CONTENT_TYPE = contentTypeHeader;
+  @Deprecated("Use dateHeader instead")
+  static const DATE = dateHeader;
+  @Deprecated("Use etagHeader instead")
+  static const ETAG = etagHeader;
+  @Deprecated("Use expectHeader instead")
+  static const EXPECT = expectHeader;
+  @Deprecated("Use expiresHeader instead")
+  static const EXPIRES = expiresHeader;
+  @Deprecated("Use fromHeader instead")
+  static const FROM = fromHeader;
+  @Deprecated("Use hostHeader instead")
+  static const HOST = hostHeader;
+  @Deprecated("Use ifMatchHeader instead")
+  static const IF_MATCH = ifMatchHeader;
+  @Deprecated("Use ifModifiedSinceHeader instead")
+  static const IF_MODIFIED_SINCE = ifModifiedSinceHeader;
+  @Deprecated("Use ifNoneMatchHeader instead")
+  static const IF_NONE_MATCH = ifNoneMatchHeader;
+  @Deprecated("Use ifRangeHeader instead")
+  static const IF_RANGE = ifRangeHeader;
+  @Deprecated("Use ifUnmodifiedSinceHeader instead")
+  static const IF_UNMODIFIED_SINCE = ifUnmodifiedSinceHeader;
+  @Deprecated("Use lastModifiedHeader instead")
+  static const LAST_MODIFIED = lastModifiedHeader;
+  @Deprecated("Use locationHeader instead")
+  static const LOCATION = locationHeader;
+  @Deprecated("Use maxForwardsHeader instead")
+  static const MAX_FORWARDS = maxForwardsHeader;
+  @Deprecated("Use pragmaHeader instead")
+  static const PRAGMA = pragmaHeader;
+  @Deprecated("Use proxyAuthenticateHeader instead")
+  static const PROXY_AUTHENTICATE = proxyAuthenticateHeader;
+  @Deprecated("Use proxyAuthorizationHeader instead")
+  static const PROXY_AUTHORIZATION = proxyAuthorizationHeader;
+  @Deprecated("Use rangeHeader instead")
+  static const RANGE = rangeHeader;
+  @Deprecated("Use refererHeader instead")
+  static const REFERER = refererHeader;
+  @Deprecated("Use retryAfterHeader instead")
+  static const RETRY_AFTER = retryAfterHeader;
+  @Deprecated("Use serverHeader instead")
+  static const SERVER = serverHeader;
+  @Deprecated("Use teHeader instead")
+  static const TE = teHeader;
+  @Deprecated("Use trailerHeader instead")
+  static const TRAILER = trailerHeader;
+  @Deprecated("Use transferEncodingHeader instead")
+  static const TRANSFER_ENCODING = transferEncodingHeader;
+  @Deprecated("Use upgradeHeader instead")
+  static const UPGRADE = upgradeHeader;
+  @Deprecated("Use userAgentHeader instead")
+  static const USER_AGENT = userAgentHeader;
+  @Deprecated("Use varyHeader instead")
+  static const VARY = varyHeader;
+  @Deprecated("Use viaHeader instead")
+  static const VIA = viaHeader;
+  @Deprecated("Use warningHeader instead")
+  static const WARNING = warningHeader;
+  @Deprecated("Use wwwAuthenticateHeader instead")
+  static const WWW_AUTHENTICATE = wwwAuthenticateHeader;
 
   // Cookie headers from RFC 6265.
-  static const COOKIE = "cookie";
-  static const SET_COOKIE = "set-cookie";
+  static const cookieHeader = "cookie";
+  static const setCookieHeader = "set-cookie";
 
-  static const GENERAL_HEADERS = const [
-    CACHE_CONTROL,
-    CONNECTION,
-    DATE,
-    PRAGMA,
-    TRAILER,
-    TRANSFER_ENCODING,
-    UPGRADE,
-    VIA,
-    WARNING
+  @Deprecated("Use cookieHeader instead")
+  static const COOKIE = cookieHeader;
+  @Deprecated("Use setCookieHeader instead")
+  static const SET_COOKIE = setCookieHeader;
+
+  static const generalHeaders = const [
+    cacheControlHeader,
+    connectionHeader,
+    dateHeader,
+    pragmaHeader,
+    trailerHeader,
+    transferEncodingHeader,
+    upgradeHeader,
+    viaHeader,
+    warningHeader
   ];
 
-  static const ENTITY_HEADERS = const [
-    ALLOW,
-    CONTENT_ENCODING,
-    CONTENT_LANGUAGE,
-    CONTENT_LENGTH,
-    CONTENT_LOCATION,
-    CONTENT_MD5,
-    CONTENT_RANGE,
-    CONTENT_TYPE,
-    EXPIRES,
-    LAST_MODIFIED
+  @Deprecated("Use generalHeaders instead")
+  static const GENERAL_HEADERS = generalHeaders;
+
+  static const entityHeaders = const [
+    allowHeader,
+    contentEncodingHeader,
+    contentLanguageHeader,
+    contentLengthHeader,
+    contentLocationHeader,
+    contentMD5Header,
+    contentRangeHeader,
+    contentTypeHeader,
+    expiresHeader,
+    lastModifiedHeader
   ];
 
-  static const RESPONSE_HEADERS = const [
-    ACCEPT_RANGES,
-    AGE,
-    ETAG,
-    LOCATION,
-    PROXY_AUTHENTICATE,
-    RETRY_AFTER,
-    SERVER,
-    VARY,
-    WWW_AUTHENTICATE
+  @Deprecated("Use entityHeaders instead")
+  static const ENTITY_HEADERS = entityHeaders;
+
+  static const responseHeaders = const [
+    acceptRangesHeader,
+    ageHeader,
+    etagHeader,
+    locationHeader,
+    proxyAuthenticateHeader,
+    retryAfterHeader,
+    serverHeader,
+    varyHeader,
+    wwwAuthenticateHeader
   ];
 
-  static const REQUEST_HEADERS = const [
-    ACCEPT,
-    ACCEPT_CHARSET,
-    ACCEPT_ENCODING,
-    ACCEPT_LANGUAGE,
-    AUTHORIZATION,
-    EXPECT,
-    FROM,
-    HOST,
-    IF_MATCH,
-    IF_MODIFIED_SINCE,
-    IF_NONE_MATCH,
-    IF_RANGE,
-    IF_UNMODIFIED_SINCE,
-    MAX_FORWARDS,
-    PROXY_AUTHORIZATION,
-    RANGE,
-    REFERER,
-    TE,
-    USER_AGENT
+  @Deprecated("Use responseHeaders instead")
+  static const RESPONSE_HEADERS = responseHeaders;
+
+  static const requestHeaders = const [
+    acceptHeader,
+    acceptCharsetHeader,
+    acceptEncodingHeader,
+    acceptLanguageHeader,
+    authorizationHeader,
+    expectHeader,
+    fromHeader,
+    hostHeader,
+    ifMatchHeader,
+    ifModifiedSinceHeader,
+    ifNoneMatchHeader,
+    ifRangeHeader,
+    ifUnmodifiedSinceHeader,
+    maxForwardsHeader,
+    proxyAuthorizationHeader,
+    rangeHeader,
+    refererHeader,
+    teHeader,
+    userAgentHeader
   ];
 
+  @Deprecated("Use requestHeaders instead")
+  static const REQUEST_HEADERS = requestHeaders;
+
   /**
    * Gets and sets the date. The value of this property will
    * reflect the 'date' header.
@@ -677,13 +877,13 @@
  *
  *     HttpClientRequest request = ...;
  *     var v = new HeaderValue("text/plain", {"q": "0.3"});
- *     request.headers.add(HttpHeaders.ACCEPT, v);
- *     request.headers.add(HttpHeaders.ACCEPT, "text/html");
+ *     request.headers.add(HttpHeaders.acceptHeader, v);
+ *     request.headers.add(HttpHeaders.acceptHeader, "text/html");
  *
  * To parse the header values use the [:parse:] static method.
  *
  *     HttpRequest request = ...;
- *     List<String> values = request.headers[HttpHeaders.ACCEPT];
+ *     List<String> values = request.headers[HttpHeaders.acceptHeader];
  *     values.forEach((value) {
  *       HeaderValue v = HeaderValue.parse(value);
  *       // Use v.value and v.parameters
@@ -767,28 +967,36 @@
    *
    *     text/plain; charset=utf-8
    */
-  static final TEXT = new ContentType("text", "plain", charset: "utf-8");
+  static final text = new ContentType("text", "plain", charset: "utf-8");
+  @Deprecated("Use text instead")
+  static final TEXT = text;
 
   /**
    *  Content type for HTML using UTF-8 encoding.
    *
    *     text/html; charset=utf-8
    */
-  static final HTML = new ContentType("text", "html", charset: "utf-8");
+  static final html = new ContentType("text", "html", charset: "utf-8");
+  @Deprecated("Use html instead")
+  static final HTML = html;
 
   /**
    *  Content type for JSON using UTF-8 encoding.
    *
    *     application/json; charset=utf-8
    */
-  static final JSON = new ContentType("application", "json", charset: "utf-8");
+  static final json = new ContentType("application", "json", charset: "utf-8");
+  @Deprecated("Use json instead")
+  static final JSON = json;
 
   /**
    *  Content type for binary data.
    *
    *     application/octet-stream
    */
-  static final BINARY = new ContentType("application", "octet-stream");
+  static final binary = new ContentType("application", "octet-stream");
+  @Deprecated("Use binary instead")
+  static final BINARY = binary;
 
   /**
    * Creates a new content type object setting the primary type and
@@ -935,7 +1143,7 @@
  * for HTTP requests. When the server receives a request,
  * it uses the HttpRequest object's `method` property to dispatch requests.
  *
- *     final HOST = InternetAddress.LOOPBACK_IP_V4;
+ *     final HOST = InternetAddress.loopbackIPv4;
  *     final PORT = 80;
  *
  *     HttpServer.bind(HOST, PORT).then((_server) {
@@ -1101,7 +1309,7 @@
  * be used.
  *
  *     HttpResponse response = ...
- *     response.headers.add(HttpHeaders.CONTENT_TYPE, "text/plain");
+ *     response.headers.add(HttpHeaders.contentTypeHeader, "text/plain");
  *     response.write(...);  // Strings written will be ISO-8859-1 encoded.
  *
  * An exception is thrown if you use the `write()` method
@@ -1120,7 +1328,7 @@
    * Gets and sets the status code. Any integer value is accepted. For
    * the official HTTP status codes use the fields from
    * [HttpStatus]. If no status code is explicitly set the default
-   * value [HttpStatus.OK] is used.
+   * value [HttpStatus.ok] is used.
    *
    * The status code must be set before the body is written
    * to. Setting the status code after writing to the response body or
@@ -1186,14 +1394,14 @@
    * The URI in [location] should be absolute, but there are no checks
    * to enforce that.
    *
-   * By default the HTTP status code `HttpStatus.MOVED_TEMPORARILY`
+   * By default the HTTP status code `HttpStatus.movedTemporarily`
    * (`302`) is used for the redirect, but an alternative one can be
    * specified using the [status] argument.
    *
    * This method will also call `close`, and the returned future is
    * the future returned by `close`.
    */
-  Future redirect(Uri location, {int status: HttpStatus.MOVED_TEMPORARILY});
+  Future redirect(Uri location, {int status: HttpStatus.movedTemporarily});
 
   /**
    * Detaches the underlying socket from the HTTP server. When the
@@ -1283,7 +1491,7 @@
  * `Accept-Encoding` header to something else.
  * To turn off gzip compression of the response, clear this header:
  *
- *      request.headers.removeAll(HttpHeaders.ACCEPT_ENCODING)
+ *      request.headers.removeAll(HttpHeaders.acceptEncodingHeader)
  *
  * ## Closing the HttpClient
  *
@@ -1305,8 +1513,13 @@
  *     client.findProxy = null;
  */
 abstract class HttpClient {
-  static const int DEFAULT_HTTP_PORT = 80;
-  static const int DEFAULT_HTTPS_PORT = 443;
+  static const int defaultHttpPort = 80;
+  @Deprecated("Use defaultHttpPort instead")
+  static const int DEFAULT_HTTP_PORT = defaultHttpPort;
+
+  static const int defaultHttpsPort = 443;
+  @Deprecated("Use defaultHttpsPort instead")
+  static const int DEFAULT_HTTPS_PORT = defaultHttpsPort;
 
   /// Gets and sets the idle timeout of non-active persistent (keep-alive)
   /// connections.
@@ -1722,7 +1935,7 @@
  * be used.
  *
  *     HttpClientRequest request = ...
- *     request.headers.add(HttpHeaders.CONTENT_TYPE, "text/plain");
+ *     request.headers.add(HttpHeaders.contentTypeHeader, "text/plain");
  *     request.write(...);  // Strings written will be ISO-8859-1 encoded.
  *
  * An exception is thrown if you use an unsupported encoding and the
@@ -1741,12 +1954,12 @@
    * automatically follow redirects. The default is [:true:].
    *
    * Automatic redirect will only happen for "GET" and "HEAD" requests
-   * and only for the status codes [:HttpStatus.MOVED_PERMANENTLY:]
-   * (301), [:HttpStatus.FOUND:] (302),
-   * [:HttpStatus.MOVED_TEMPORARILY:] (302, alias for
-   * [:HttpStatus.FOUND:]), [:HttpStatus.SEE_OTHER:] (303) and
-   * [:HttpStatus.TEMPORARY_REDIRECT:] (307). For
-   * [:HttpStatus.SEE_OTHER:] (303) automatic redirect will also happen
+   * and only for the status codes [:HttpStatus.movedPermanently:]
+   * (301), [:HttpStatus.found:] (302),
+   * [:HttpStatus.movedTemporarily:] (302, alias for
+   * [:HttpStatus.found:]), [:HttpStatus.seeOther:] (303) and
+   * [:HttpStatus.temporaryRedirect:] (307). For
+   * [:HttpStatus.seeOther:] (303) automatic redirect will also happen
    * for "POST" requests with the method changed to "GET" when
    * following the redirect.
    *
@@ -1878,9 +2091,9 @@
 
   /**
    * Returns whether the status code is one of the normal redirect
-   * codes [HttpStatus.MOVED_PERMANENTLY], [HttpStatus.FOUND],
-   * [HttpStatus.MOVED_TEMPORARILY], [HttpStatus.SEE_OTHER] and
-   * [HttpStatus.TEMPORARY_REDIRECT].
+   * codes [HttpStatus.movedPermanently], [HttpStatus.found],
+   * [HttpStatus.movedTemporarily], [HttpStatus.seeOther] and
+   * [HttpStatus.temporaryRedirect].
    */
   bool get isRedirect;
 
@@ -1894,7 +2107,7 @@
   /**
    * Redirects this connection to a new URL. The default value for
    * [method] is the method for the current request. The default value
-   * for [url] is the value of the [HttpHeaders.LOCATION] header of
+   * for [url] is the value of the [HttpHeaders.locationHeader] header of
    * the current response. All body data must have been read from the
    * current response before calling [redirect].
    *
diff --git a/sdk/lib/_http/http_headers.dart b/sdk/lib/_http/http_headers.dart
index 0e1d91f..bb607ba 100644
--- a/sdk/lib/_http/http_headers.dart
+++ b/sdk/lib/_http/http_headers.dart
@@ -20,7 +20,7 @@
   final int _defaultPortForScheme;
 
   _HttpHeaders(this.protocolVersion,
-      {int defaultPortForScheme: HttpClient.DEFAULT_HTTP_PORT,
+      {int defaultPortForScheme: HttpClient.defaultHttpPort,
       _HttpHeaders initialHeaders})
       : _headers = new HashMap<String, List<String>>(),
         _defaultPortForScheme = defaultPortForScheme {
@@ -70,7 +70,7 @@
     _checkMutable();
     name = _validateField(name);
     _headers.remove(name);
-    if (name == HttpHeaders.TRANSFER_ENCODING) {
+    if (name == HttpHeaders.transferEncodingHeader) {
       _chunkedTransferEncoding = false;
     }
     _addAll(name, value);
@@ -88,7 +88,7 @@
       }
       if (values.length == 0) _headers.remove(name);
     }
-    if (name == HttpHeaders.TRANSFER_ENCODING && value == "chunked") {
+    if (name == HttpHeaders.transferEncodingHeader && value == "chunked") {
       _chunkedTransferEncoding = false;
     }
   }
@@ -115,20 +115,20 @@
     if (persistentConnection == _persistentConnection) return;
     if (persistentConnection) {
       if (protocolVersion == "1.1") {
-        remove(HttpHeaders.CONNECTION, "close");
+        remove(HttpHeaders.connectionHeader, "close");
       } else {
         if (_contentLength == -1) {
           throw new HttpException(
               "Trying to set 'Connection: Keep-Alive' on HTTP 1.0 headers with "
               "no ContentLength");
         }
-        add(HttpHeaders.CONNECTION, "keep-alive");
+        add(HttpHeaders.connectionHeader, "keep-alive");
       }
     } else {
       if (protocolVersion == "1.1") {
-        add(HttpHeaders.CONNECTION, "close");
+        add(HttpHeaders.connectionHeader, "close");
       } else {
-        remove(HttpHeaders.CONNECTION, "keep-alive");
+        remove(HttpHeaders.connectionHeader, "keep-alive");
       }
     }
     _persistentConnection = persistentConnection;
@@ -149,9 +149,9 @@
     _contentLength = contentLength;
     if (_contentLength >= 0) {
       if (chunkedTransferEncoding) chunkedTransferEncoding = false;
-      _set(HttpHeaders.CONTENT_LENGTH, contentLength.toString());
+      _set(HttpHeaders.contentLengthHeader, contentLength.toString());
     } else {
-      removeAll(HttpHeaders.CONTENT_LENGTH);
+      removeAll(HttpHeaders.contentLengthHeader);
       if (protocolVersion == "1.1") {
         chunkedTransferEncoding = true;
       }
@@ -168,15 +168,15 @@
     }
     if (chunkedTransferEncoding == _chunkedTransferEncoding) return;
     if (chunkedTransferEncoding) {
-      List<String> values = _headers[HttpHeaders.TRANSFER_ENCODING];
+      List<String> values = _headers[HttpHeaders.transferEncodingHeader];
       if ((values == null || values.last != "chunked")) {
         // Headers does not specify chunked encoding - add it if set.
-        _addValue(HttpHeaders.TRANSFER_ENCODING, "chunked");
+        _addValue(HttpHeaders.transferEncodingHeader, "chunked");
       }
       contentLength = -1;
     } else {
       // Headers does specify chunked encoding - remove it if not set.
-      remove(HttpHeaders.TRANSFER_ENCODING, "chunked");
+      remove(HttpHeaders.transferEncodingHeader, "chunked");
     }
     _chunkedTransferEncoding = chunkedTransferEncoding;
   }
@@ -198,7 +198,7 @@
   }
 
   DateTime get ifModifiedSince {
-    List<String> values = _headers[HttpHeaders.IF_MODIFIED_SINCE];
+    List<String> values = _headers[HttpHeaders.ifModifiedSinceHeader];
     if (values != null) {
       try {
         return HttpDate.parse(values[0]);
@@ -213,11 +213,11 @@
     _checkMutable();
     // Format "ifModifiedSince" header with date in Greenwich Mean Time (GMT).
     String formatted = HttpDate.format(ifModifiedSince.toUtc());
-    _set(HttpHeaders.IF_MODIFIED_SINCE, formatted);
+    _set(HttpHeaders.ifModifiedSinceHeader, formatted);
   }
 
   DateTime get date {
-    List<String> values = _headers[HttpHeaders.DATE];
+    List<String> values = _headers[HttpHeaders.dateHeader];
     if (values != null) {
       try {
         return HttpDate.parse(values[0]);
@@ -236,7 +236,7 @@
   }
 
   DateTime get expires {
-    List<String> values = _headers[HttpHeaders.EXPIRES];
+    List<String> values = _headers[HttpHeaders.expiresHeader];
     if (values != null) {
       try {
         return HttpDate.parse(values[0]);
@@ -251,7 +251,7 @@
     _checkMutable();
     // Format "Expires" header with date in Greenwich Mean Time (GMT).
     String formatted = HttpDate.format(expires.toUtc());
-    _set(HttpHeaders.EXPIRES, formatted);
+    _set(HttpHeaders.expiresHeader, formatted);
   }
 
   ContentType get contentType {
@@ -265,7 +265,7 @@
 
   void set contentType(ContentType contentType) {
     _checkMutable();
-    _set(HttpHeaders.CONTENT_TYPE, contentType.toString());
+    _set(HttpHeaders.contentTypeHeader, contentType.toString());
   }
 
   void clear() {
@@ -285,45 +285,45 @@
     // faster than computing hash and looking up in a hash-map.
     switch (name.length) {
       case 4:
-        if (HttpHeaders.DATE == name) {
+        if (HttpHeaders.dateHeader == name) {
           _addDate(name, value);
           return;
         }
-        if (HttpHeaders.HOST == name) {
+        if (HttpHeaders.hostHeader == name) {
           _addHost(name, value);
           return;
         }
         break;
       case 7:
-        if (HttpHeaders.EXPIRES == name) {
+        if (HttpHeaders.expiresHeader == name) {
           _addExpires(name, value);
           return;
         }
         break;
       case 10:
-        if (HttpHeaders.CONNECTION == name) {
+        if (HttpHeaders.connectionHeader == name) {
           _addConnection(name, value);
           return;
         }
         break;
       case 12:
-        if (HttpHeaders.CONTENT_TYPE == name) {
+        if (HttpHeaders.contentTypeHeader == name) {
           _addContentType(name, value);
           return;
         }
         break;
       case 14:
-        if (HttpHeaders.CONTENT_LENGTH == name) {
+        if (HttpHeaders.contentLengthHeader == name) {
           _addContentLength(name, value);
           return;
         }
         break;
       case 17:
-        if (HttpHeaders.TRANSFER_ENCODING == name) {
+        if (HttpHeaders.transferEncodingHeader == name) {
           _addTransferEncoding(name, value);
           return;
         }
-        if (HttpHeaders.IF_MODIFIED_SINCE == name) {
+        if (HttpHeaders.ifModifiedSinceHeader == name) {
           _addIfModifiedSince(name, value);
           return;
         }
@@ -345,7 +345,7 @@
     if (value == "chunked") {
       chunkedTransferEncoding = true;
     } else {
-      _addValue(HttpHeaders.TRANSFER_ENCODING, value);
+      _addValue(HttpHeaders.transferEncodingHeader, value);
     }
   }
 
@@ -353,7 +353,7 @@
     if (value is DateTime) {
       date = value;
     } else if (value is String) {
-      _set(HttpHeaders.DATE, value);
+      _set(HttpHeaders.dateHeader, value);
     } else {
       throw new HttpException("Unexpected type for header named $name");
     }
@@ -363,7 +363,7 @@
     if (value is DateTime) {
       expires = value;
     } else if (value is String) {
-      _set(HttpHeaders.EXPIRES, value);
+      _set(HttpHeaders.expiresHeader, value);
     } else {
       throw new HttpException("Unexpected type for header named $name");
     }
@@ -373,7 +373,7 @@
     if (value is DateTime) {
       ifModifiedSince = value;
     } else if (value is String) {
-      _set(HttpHeaders.IF_MODIFIED_SINCE, value);
+      _set(HttpHeaders.ifModifiedSinceHeader, value);
     } else {
       throw new HttpException("Unexpected type for header named $name");
     }
@@ -384,7 +384,7 @@
       int pos = value.indexOf(":");
       if (pos == -1) {
         _host = value;
-        _port = HttpClient.DEFAULT_HTTP_PORT;
+        _port = HttpClient.defaultHttpPort;
       } else {
         if (pos > 0) {
           _host = value.substring(0, pos);
@@ -392,7 +392,7 @@
           _host = null;
         }
         if (pos + 1 == value.length) {
-          _port = HttpClient.DEFAULT_HTTP_PORT;
+          _port = HttpClient.defaultHttpPort;
         } else {
           try {
             _port = int.parse(value.substring(pos + 1));
@@ -401,7 +401,7 @@
           }
         }
       }
-      _set(HttpHeaders.HOST, value);
+      _set(HttpHeaders.hostHeader, value);
     } else {
       throw new HttpException("Unexpected type for header named $name");
     }
@@ -418,7 +418,7 @@
   }
 
   void _addContentType(String name, value) {
-    _set(HttpHeaders.CONTENT_TYPE, value);
+    _set(HttpHeaders.contentTypeHeader, value);
   }
 
   void _addValue(String name, Object value) {
@@ -453,7 +453,7 @@
   }
 
   _foldHeader(String name) {
-    if (name == HttpHeaders.SET_COOKIE ||
+    if (name == HttpHeaders.setCookieHeader ||
         (_noFoldingHeaders != null && _noFoldingHeaders.indexOf(name) != -1)) {
       return false;
     }
@@ -577,7 +577,7 @@
       }
     }
 
-    List<String> values = _headers[HttpHeaders.COOKIE];
+    List<String> values = _headers[HttpHeaders.cookieHeader];
     if (values != null) {
       values.forEach((headerValue) => parseCookieString(headerValue));
     }
diff --git a/sdk/lib/_http/http_impl.dart b/sdk/lib/_http/http_impl.dart
index 8061440..3a1ec29 100644
--- a/sdk/lib/_http/http_impl.dart
+++ b/sdk/lib/_http/http_impl.dart
@@ -311,7 +311,7 @@
   List<Cookie> get cookies {
     if (_cookies != null) return _cookies;
     _cookies = new List<Cookie>();
-    List<String> values = headers[HttpHeaders.SET_COOKIE];
+    List<String> values = headers[HttpHeaders.setCookieHeader];
     if (values != null) {
       values.forEach((value) {
         _cookies.add(new Cookie.fromSetCookieValue(value));
@@ -322,12 +322,12 @@
 
   bool get isRedirect {
     if (_httpRequest.method == "GET" || _httpRequest.method == "HEAD") {
-      return statusCode == HttpStatus.MOVED_PERMANENTLY ||
-          statusCode == HttpStatus.FOUND ||
-          statusCode == HttpStatus.SEE_OTHER ||
-          statusCode == HttpStatus.TEMPORARY_REDIRECT;
+      return statusCode == HttpStatus.movedPermanently ||
+          statusCode == HttpStatus.found ||
+          statusCode == HttpStatus.seeOther ||
+          statusCode == HttpStatus.temporaryRedirect;
     } else if (_httpRequest.method == "POST") {
-      return statusCode == HttpStatus.SEE_OTHER;
+      return statusCode == HttpStatus.seeOther;
     }
     return false;
   }
@@ -336,14 +336,14 @@
       [String method, Uri url, bool followLoops]) {
     if (method == null) {
       // Set method as defined by RFC 2616 section 10.3.4.
-      if (statusCode == HttpStatus.SEE_OTHER && _httpRequest.method == "POST") {
+      if (statusCode == HttpStatus.seeOther && _httpRequest.method == "POST") {
         method = "GET";
       } else {
         method = _httpRequest.method;
       }
     }
     if (url == null) {
-      String location = headers.value(HttpHeaders.LOCATION);
+      String location = headers.value(HttpHeaders.locationHeader);
       if (location == null) {
         throw new StateError("Response has no Location header for redirect");
       }
@@ -378,8 +378,8 @@
     }
     Stream<List<int>> stream = _incoming;
     if (_httpClient.autoUncompress &&
-        headers.value(HttpHeaders.CONTENT_ENCODING) == "gzip") {
-      stream = stream.transform(GZIP.decoder);
+        headers.value(HttpHeaders.contentEncodingHeader) == "gzip") {
+      stream = stream.transform(gzip.decoder);
     }
     return stream.listen(onData,
         onError: onError, onDone: onDone, cancelOnError: cancelOnError);
@@ -394,16 +394,16 @@
 
   bool get _shouldAuthenticateProxy {
     // Only try to authenticate if there is a challenge in the response.
-    List<String> challenge = headers[HttpHeaders.PROXY_AUTHENTICATE];
-    return statusCode == HttpStatus.PROXY_AUTHENTICATION_REQUIRED &&
+    List<String> challenge = headers[HttpHeaders.proxyAuthenticateHeader];
+    return statusCode == HttpStatus.proxyAuthenticationRequired &&
         challenge != null &&
         challenge.length == 1;
   }
 
   bool get _shouldAuthenticate {
     // Only try to authenticate if there is a challenge in the response.
-    List<String> challenge = headers[HttpHeaders.WWW_AUTHENTICATE];
-    return statusCode == HttpStatus.UNAUTHORIZED &&
+    List<String> challenge = headers[HttpHeaders.wwwAuthenticateHeader];
+    return statusCode == HttpStatus.unauthorized &&
         challenge != null &&
         challenge.length == 1;
   }
@@ -421,8 +421,8 @@
 
     List<String> authChallenge() {
       return proxyAuth
-          ? headers[HttpHeaders.PROXY_AUTHENTICATE]
-          : headers[HttpHeaders.WWW_AUTHENTICATE];
+          ? headers[HttpHeaders.proxyAuthenticateHeader]
+          : headers[HttpHeaders.wwwAuthenticateHeader];
     }
 
     _Credentials findCredentials(_AuthenticationScheme scheme) {
@@ -722,8 +722,8 @@
       : _uri = uri,
         headers = new _HttpHeaders(protocolVersion,
             defaultPortForScheme: uri.scheme == 'https'
-                ? HttpClient.DEFAULT_HTTPS_PORT
-                : HttpClient.DEFAULT_HTTP_PORT,
+                ? HttpClient.defaultHttpsPort
+                : HttpClient.defaultHttpPort,
             initialHeaders: initialHeaders),
         _outgoing = outgoing,
         super(outgoing, null) {
@@ -812,7 +812,7 @@
     _reasonPhrase = reasonPhrase;
   }
 
-  Future redirect(Uri location, {int status: HttpStatus.MOVED_TEMPORARILY}) {
+  Future redirect(Uri location, {int status: HttpStatus.movedTemporarily}) {
     if (_outgoing.headersWritten) throw new StateError("Header already sent");
     statusCode = status;
     headers.set("location", location.toString());
@@ -895,7 +895,7 @@
     // Add all the cookies set to the headers.
     if (_cookies != null) {
       _cookies.forEach((cookie) {
-        headers.add(HttpHeaders.SET_COOKIE, cookie);
+        headers.add(HttpHeaders.setCookieHeader, cookie);
       });
     }
 
@@ -915,85 +915,85 @@
     }
 
     switch (statusCode) {
-      case HttpStatus.CONTINUE:
+      case HttpStatus.continue_:
         return "Continue";
-      case HttpStatus.SWITCHING_PROTOCOLS:
+      case HttpStatus.switchingProtocols:
         return "Switching Protocols";
-      case HttpStatus.OK:
+      case HttpStatus.ok:
         return "OK";
-      case HttpStatus.CREATED:
+      case HttpStatus.created:
         return "Created";
-      case HttpStatus.ACCEPTED:
+      case HttpStatus.accepted:
         return "Accepted";
-      case HttpStatus.NON_AUTHORITATIVE_INFORMATION:
+      case HttpStatus.nonAuthoritativeInformation:
         return "Non-Authoritative Information";
-      case HttpStatus.NO_CONTENT:
+      case HttpStatus.noContent:
         return "No Content";
-      case HttpStatus.RESET_CONTENT:
+      case HttpStatus.resetContent:
         return "Reset Content";
-      case HttpStatus.PARTIAL_CONTENT:
+      case HttpStatus.partialContent:
         return "Partial Content";
-      case HttpStatus.MULTIPLE_CHOICES:
+      case HttpStatus.multipleChoices:
         return "Multiple Choices";
-      case HttpStatus.MOVED_PERMANENTLY:
+      case HttpStatus.movedPermanently:
         return "Moved Permanently";
-      case HttpStatus.FOUND:
+      case HttpStatus.found:
         return "Found";
-      case HttpStatus.SEE_OTHER:
+      case HttpStatus.seeOther:
         return "See Other";
-      case HttpStatus.NOT_MODIFIED:
+      case HttpStatus.notModified:
         return "Not Modified";
-      case HttpStatus.USE_PROXY:
+      case HttpStatus.useProxy:
         return "Use Proxy";
-      case HttpStatus.TEMPORARY_REDIRECT:
+      case HttpStatus.temporaryRedirect:
         return "Temporary Redirect";
-      case HttpStatus.BAD_REQUEST:
+      case HttpStatus.badRequest:
         return "Bad Request";
-      case HttpStatus.UNAUTHORIZED:
+      case HttpStatus.unauthorized:
         return "Unauthorized";
-      case HttpStatus.PAYMENT_REQUIRED:
+      case HttpStatus.paymentRequired:
         return "Payment Required";
-      case HttpStatus.FORBIDDEN:
+      case HttpStatus.forbidden:
         return "Forbidden";
-      case HttpStatus.NOT_FOUND:
+      case HttpStatus.notFound:
         return "Not Found";
-      case HttpStatus.METHOD_NOT_ALLOWED:
+      case HttpStatus.methodNotAllowed:
         return "Method Not Allowed";
-      case HttpStatus.NOT_ACCEPTABLE:
+      case HttpStatus.notAcceptable:
         return "Not Acceptable";
-      case HttpStatus.PROXY_AUTHENTICATION_REQUIRED:
+      case HttpStatus.proxyAuthenticationRequired:
         return "Proxy Authentication Required";
-      case HttpStatus.REQUEST_TIMEOUT:
+      case HttpStatus.requestTimeout:
         return "Request Time-out";
-      case HttpStatus.CONFLICT:
+      case HttpStatus.conflict:
         return "Conflict";
-      case HttpStatus.GONE:
+      case HttpStatus.gone:
         return "Gone";
-      case HttpStatus.LENGTH_REQUIRED:
+      case HttpStatus.lengthRequired:
         return "Length Required";
-      case HttpStatus.PRECONDITION_FAILED:
+      case HttpStatus.preconditionFailed:
         return "Precondition Failed";
-      case HttpStatus.REQUEST_ENTITY_TOO_LARGE:
+      case HttpStatus.requestEntityTooLarge:
         return "Request Entity Too Large";
-      case HttpStatus.REQUEST_URI_TOO_LONG:
-        return "Request-URI Too Large";
-      case HttpStatus.UNSUPPORTED_MEDIA_TYPE:
+      case HttpStatus.requestUriTooLong:
+        return "Request-URI Too Long";
+      case HttpStatus.unsupportedMediaType:
         return "Unsupported Media Type";
-      case HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE:
+      case HttpStatus.requestedRangeNotSatisfiable:
         return "Requested range not satisfiable";
-      case HttpStatus.EXPECTATION_FAILED:
+      case HttpStatus.expectationFailed:
         return "Expectation Failed";
-      case HttpStatus.INTERNAL_SERVER_ERROR:
+      case HttpStatus.internalServerError:
         return "Internal Server Error";
-      case HttpStatus.NOT_IMPLEMENTED:
+      case HttpStatus.notImplemented:
         return "Not Implemented";
-      case HttpStatus.BAD_GATEWAY:
+      case HttpStatus.badGateway:
         return "Bad Gateway";
-      case HttpStatus.SERVICE_UNAVAILABLE:
+      case HttpStatus.serviceUnavailable:
         return "Service Unavailable";
-      case HttpStatus.GATEWAY_TIMEOUT:
+      case HttpStatus.gatewayTimeout:
         return "Gateway Time-out";
-      case HttpStatus.HTTP_VERSION_NOT_SUPPORTED:
+      case HttpStatus.httpVersionNotSupported:
         return "Http Version not supported";
       default:
         return "Status $statusCode";
@@ -1146,7 +1146,7 @@
         if (i > 0) sb.write("; ");
         sb..write(cookies[i].name)..write("=")..write(cookies[i].value);
       }
-      headers.add(HttpHeaders.COOKIE, sb.toString());
+      headers.add(HttpHeaders.cookieHeader, sb.toString());
     }
 
     headers._finalize();
@@ -1253,14 +1253,14 @@
           outbound.bufferOutput &&
           outbound.headers.chunkedTransferEncoding) {
         List acceptEncodings =
-            response._httpRequest.headers[HttpHeaders.ACCEPT_ENCODING];
-        List contentEncoding = outbound.headers[HttpHeaders.CONTENT_ENCODING];
+            response._httpRequest.headers[HttpHeaders.acceptEncodingHeader];
+        List contentEncoding = outbound.headers[HttpHeaders.contentEncodingHeader];
         if (acceptEncodings != null &&
             acceptEncodings
                 .expand((list) => list.split(","))
                 .any((encoding) => encoding.trim().toLowerCase() == "gzip") &&
             contentEncoding == null) {
-          outbound.headers.set(HttpHeaders.CONTENT_ENCODING, "gzip");
+          outbound.headers.set(HttpHeaders.contentEncodingHeader, "gzip");
           gzip = true;
         }
       }
@@ -1650,7 +1650,7 @@
     request.headers
       ..host = host
       ..port = port
-      .._add(HttpHeaders.ACCEPT_ENCODING, "gzip");
+      .._add(HttpHeaders.acceptEncodingHeader, "gzip");
     if (_httpClient.userAgent != null) {
       request.headers._add('user-agent', _httpClient.userAgent);
     }
@@ -1659,7 +1659,7 @@
       // for proxy basic authorization.
       String auth = _CryptoUtils
           .bytesToBase64(utf8.encode("${proxy.username}:${proxy.password}"));
-      request.headers.set(HttpHeaders.PROXY_AUTHORIZATION, "Basic $auth");
+      request.headers.set(HttpHeaders.proxyAuthorizationHeader, "Basic $auth");
     } else if (!proxy.isDirect && _httpClient._proxyCredentials.length > 0) {
       proxyCreds = _httpClient._findProxyCredentials(proxy);
       if (proxyCreds != null) {
@@ -1670,7 +1670,7 @@
       // If the URL contains user information use that for basic
       // authorization.
       String auth = _CryptoUtils.bytesToBase64(utf8.encode(uri.userInfo));
-      request.headers.set(HttpHeaders.AUTHORIZATION, "Basic $auth");
+      request.headers.set(HttpHeaders.authorizationHeader, "Basic $auth");
     } else {
       // Look for credentials.
       creds = _httpClient._findCredentials(uri);
@@ -1779,10 +1779,10 @@
       // for proxy basic authorization.
       String auth = _CryptoUtils
           .bytesToBase64(utf8.encode("${proxy.username}:${proxy.password}"));
-      request.headers.set(HttpHeaders.PROXY_AUTHORIZATION, "Basic $auth");
+      request.headers.set(HttpHeaders.proxyAuthorizationHeader, "Basic $auth");
     }
     return request.close().then((response) {
-      if (response.statusCode != HttpStatus.OK) {
+      if (response.statusCode != HttpStatus.ok) {
         throw "Proxy failed to establish tunnel "
             "(${response.statusCode} ${response.reasonPhrase})";
       }
@@ -1927,7 +1927,7 @@
     _connecting++;
     return socketFuture.then((socket) {
       _connecting--;
-      socket.setOption(SocketOption.TCP_NODELAY, true);
+      socket.setOption(SocketOption.tcpNoDelay, true);
       var connection =
           new _HttpClientConnection(key, socket, client, false, context);
       if (isSecure && !proxy.isDirect) {
@@ -2101,8 +2101,8 @@
     int port = uri.port;
     if (port == 0) {
       port = isSecure
-          ? HttpClient.DEFAULT_HTTPS_PORT
-          : HttpClient.DEFAULT_HTTP_PORT;
+          ? HttpClient.defaultHttpsPort
+          : HttpClient.defaultHttpPort;
     }
     // Check to see if a proxy server should be used for this connection.
     var proxyConf = const _ProxyConfiguration.direct();
@@ -2541,7 +2541,7 @@
 
   static HttpHeaders _initDefaultResponseHeaders() {
     var defaultResponseHeaders = new _HttpHeaders('1.1');
-    defaultResponseHeaders.contentType = ContentType.TEXT;
+    defaultResponseHeaders.contentType = ContentType.text;
     defaultResponseHeaders.set('X-Frame-Options', 'SAMEORIGIN');
     defaultResponseHeaders.set('X-Content-Type-Options', 'nosniff');
     defaultResponseHeaders.set('X-XSS-Protection', '1; mode=block');
@@ -2572,7 +2572,7 @@
   StreamSubscription<HttpRequest> listen(void onData(HttpRequest event),
       {Function onError, void onDone(), bool cancelOnError}) {
     _serverSocket.listen((Socket socket) {
-      socket.setOption(SocketOption.TCP_NODELAY, true);
+      socket.setOption(SocketOption.tcpNoDelay, true);
       // Accept the client connection.
       _HttpConnection connection = new _HttpConnection(socket, this);
       _idleConnections.add(connection);
@@ -2974,8 +2974,8 @@
     if (scheme != null && credentials.scheme != scheme) return false;
     if (uri.host != this.uri.host) return false;
     int thisPort =
-        this.uri.port == 0 ? HttpClient.DEFAULT_HTTP_PORT : this.uri.port;
-    int otherPort = uri.port == 0 ? HttpClient.DEFAULT_HTTP_PORT : uri.port;
+        this.uri.port == 0 ? HttpClient.defaultHttpPort: this.uri.port;
+    int otherPort = uri.port == 0 ? HttpClient.defaultHttpPort: uri.port;
     if (otherPort != thisPort) return false;
     return uri.path.startsWith(this.uri.path);
   }
@@ -3041,11 +3041,11 @@
   }
 
   void authorize(_Credentials _, HttpClientRequest request) {
-    request.headers.set(HttpHeaders.AUTHORIZATION, authorization());
+    request.headers.set(HttpHeaders.authorizationHeader, authorization());
   }
 
   void authorizeProxy(_ProxyCredentials _, HttpClientRequest request) {
-    request.headers.set(HttpHeaders.PROXY_AUTHORIZATION, authorization());
+    request.headers.set(HttpHeaders.proxyAuthorizationHeader, authorization());
   }
 }
 
@@ -3114,13 +3114,13 @@
 
   void authorize(_Credentials credentials, HttpClientRequest request) {
     request.headers
-        .set(HttpHeaders.AUTHORIZATION, authorization(credentials, request));
+        .set(HttpHeaders.authorizationHeader, authorization(credentials, request));
   }
 
   void authorizeProxy(
       _ProxyCredentials credentials, HttpClientRequest request) {
     request.headers.set(
-        HttpHeaders.PROXY_AUTHORIZATION, authorization(credentials, request));
+        HttpHeaders.proxyAuthorizationHeader, authorization(credentials, request));
   }
 }
 
diff --git a/sdk/lib/_http/http_parser.dart b/sdk/lib/_http/http_parser.dart
index be26555..eb7663b 100644
--- a/sdk/lib/_http/http_parser.dart
+++ b/sdk/lib/_http/http_parser.dart
@@ -666,8 +666,8 @@
               List<String> tokens = _tokenizeFieldValue(headerValue);
               final bool isResponse = _messageType == _MessageType.RESPONSE;
               final bool isUpgradeCode =
-                  (_statusCode == HttpStatus.UPGRADE_REQUIRED) ||
-                      (_statusCode == HttpStatus.SWITCHING_PROTOCOLS);
+                  (_statusCode == HttpStatus.upgradeRequired) ||
+                      (_statusCode == HttpStatus.switchingProtocols);
               for (int i = 0; i < tokens.length; i++) {
                 final bool isUpgrade = _caseInsensitiveCompare(
                     "upgrade".codeUnits, tokens[i].codeUnits);
diff --git a/sdk/lib/_http/websocket.dart b/sdk/lib/_http/websocket.dart
index 33a4f18..35f4690 100644
--- a/sdk/lib/_http/websocket.dart
+++ b/sdk/lib/_http/websocket.dart
@@ -8,19 +8,46 @@
  * WebSocket status codes used when closing a WebSocket connection.
  */
 abstract class WebSocketStatus {
-  static const int NORMAL_CLOSURE = 1000;
-  static const int GOING_AWAY = 1001;
-  static const int PROTOCOL_ERROR = 1002;
-  static const int UNSUPPORTED_DATA = 1003;
-  static const int RESERVED_1004 = 1004;
-  static const int NO_STATUS_RECEIVED = 1005;
-  static const int ABNORMAL_CLOSURE = 1006;
-  static const int INVALID_FRAME_PAYLOAD_DATA = 1007;
-  static const int POLICY_VIOLATION = 1008;
-  static const int MESSAGE_TOO_BIG = 1009;
-  static const int MISSING_MANDATORY_EXTENSION = 1010;
-  static const int INTERNAL_SERVER_ERROR = 1011;
-  static const int RESERVED_1015 = 1015;
+  static const int normalClosure = 1000;
+  static const int goingAway = 1001;
+  static const int protocolError = 1002;
+  static const int unsupportedData = 1003;
+  static const int reserved1004 = 1004;
+  static const int noStatusReceived = 1005;
+  static const int abnormalClosure = 1006;
+  static const int invalidFramePayloadData = 1007;
+  static const int policyViolation = 1008;
+  static const int messageTooBig = 1009;
+  static const int missingMandatoryExtension = 1010;
+  static const int internalServerError = 1011;
+  static const int reserved1015 = 1015;
+
+  @Deprecated("Use normalClosure instead")
+  static const int NORMAL_CLOSURE = normalClosure;
+  @Deprecated("Use goingAway instead")
+  static const int GOING_AWAY = goingAway;
+  @Deprecated("Use protocolError instead")
+  static const int PROTOCOL_ERROR = protocolError;
+  @Deprecated("Use unsupportedData instead")
+  static const int UNSUPPORTED_DATA = unsupportedData;
+  @Deprecated("Use reserved1004 instead")
+  static const int RESERVED_1004 = reserved1004;
+  @Deprecated("Use noStatusReceived instead")
+  static const int NO_STATUS_RECEIVED = noStatusReceived;
+  @Deprecated("Use abnormalClosure instead")
+  static const int ABNORMAL_CLOSURE = abnormalClosure;
+  @Deprecated("Use invalidFramePayloadData instead")
+  static const int INVALID_FRAME_PAYLOAD_DATA = invalidFramePayloadData;
+  @Deprecated("Use policyViolation instead")
+  static const int POLICY_VIOLATION = policyViolation;
+  @Deprecated("Use messageTooBig instead")
+  static const int MESSAGE_TOO_BIG = messageTooBig;
+  @Deprecated("Use missingMandatoryExtension instead")
+  static const int MISSING_MANDATORY_EXTENSION = missingMandatoryExtension;
+  @Deprecated("Use internalServerError instead")
+  static const int INTERNAL_SERVER_ERROR = internalServerError;
+  @Deprecated("Use reserved1015 instead")
+  static const int RESERVED_1015 = reserved1015;
 }
 
 /**
@@ -36,13 +63,18 @@
    * clientMaxWindowBits: 15
    * serverMaxWindowBits: 15
    */
-  static const CompressionOptions DEFAULT = const CompressionOptions();
+  static const CompressionOptions compressionDefault =
+      const CompressionOptions();
+  @Deprecated("Use compressionDefault instead")
+  static const CompressionOptions DEFAULT = compressionDefault;
 
   /**
    * Disables WebSocket Compression.
    */
-  static const CompressionOptions OFF =
+  static const CompressionOptions compressionOff =
       const CompressionOptions(enabled: false);
+  @Deprecated("Use compressionOff instead")
+  static const CompressionOptions OFF = compressionOff;
 
   /**
    * Control whether the client will reuse it's compression instances.
@@ -215,7 +247,7 @@
    */
   factory WebSocketTransformer(
       {/*String|Future<String>*/ protocolSelector(List<String> protocols),
-      CompressionOptions compression: CompressionOptions.DEFAULT}) {
+      CompressionOptions compression: CompressionOptions.compressionDefault}) {
     return new _WebSocketTransformerImpl(protocolSelector, compression);
   }
 
@@ -238,7 +270,7 @@
    */
   static Future<WebSocket> upgrade(HttpRequest request,
       {protocolSelector(List<String> protocols),
-      CompressionOptions compression: CompressionOptions.DEFAULT}) {
+      CompressionOptions compression: CompressionOptions.compressionDefault}) {
     return _WebSocketTransformerImpl._upgrade(
         request, protocolSelector, compression);
   }
@@ -264,10 +296,19 @@
   /**
    * Possible states of the connection.
    */
-  static const int CONNECTING = 0;
-  static const int OPEN = 1;
-  static const int CLOSING = 2;
-  static const int CLOSED = 3;
+  static const int connecting = 0;
+  static const int open = 1;
+  static const int closing = 2;
+  static const int closed = 3;
+
+  @Deprecated("Use connecting instead")
+  static const int CONNECTING = connecting;
+  @Deprecated("Use open instead")
+  static const int OPEN = open;
+  @Deprecated("Use closing instead")
+  static const int CLOSING = closing;
+  @Deprecated("Use closed instead")
+  static const int CLOSED = closed;
 
   /**
    * Set and get the interval for sending ping signals. If a ping message is not
@@ -315,7 +356,8 @@
   static Future<WebSocket> connect(String url,
           {Iterable<String> protocols,
           Map<String, dynamic> headers,
-          CompressionOptions compression: CompressionOptions.DEFAULT}) =>
+          CompressionOptions compression:
+              CompressionOptions.compressionDefault}) =>
       _WebSocketImpl.connect(url, protocols, headers, compression: compression);
 
   @Deprecated('This constructor will be removed in Dart 2.0. Use `implements`'
@@ -344,7 +386,7 @@
   factory WebSocket.fromUpgradedSocket(Socket socket,
       {String protocol,
       bool serverSide,
-      CompressionOptions compression: CompressionOptions.DEFAULT}) {
+      CompressionOptions compression: CompressionOptions.compressionDefault}) {
     if (serverSide == null) {
       throw new ArgumentError("The serverSide argument must be passed "
           "explicitly to WebSocket.fromUpgradedSocket.");
diff --git a/sdk/lib/_http/websocket_impl.dart b/sdk/lib/_http/websocket_impl.dart
index fa89b00..330f9ea 100644
--- a/sdk/lib/_http/websocket_impl.dart
+++ b/sdk/lib/_http/websocket_impl.dart
@@ -449,7 +449,7 @@
     if (!_isUpgradeRequest(request)) {
       // Send error response.
       response
-        ..statusCode = HttpStatus.BAD_REQUEST
+        ..statusCode = HttpStatus.badRequest
         ..close();
       return new Future.error(
           new WebSocketException("Invalid WebSocket upgrade request"));
@@ -458,9 +458,9 @@
     Future<WebSocket> upgrade(String protocol) {
       // Send the upgrade response.
       response
-        ..statusCode = HttpStatus.SWITCHING_PROTOCOLS
-        ..headers.add(HttpHeaders.CONNECTION, "Upgrade")
-        ..headers.add(HttpHeaders.UPGRADE, "websocket");
+        ..statusCode = HttpStatus.switchingProtocols
+        ..headers.add(HttpHeaders.connectionHeader, "Upgrade")
+        ..headers.add(HttpHeaders.upgradeHeader, "websocket");
       String key = request.headers.value("Sec-WebSocket-Key");
       _SHA1 sha1 = new _SHA1();
       sha1.add("$key$_webSocketGUID".codeUnits);
@@ -493,7 +493,7 @@
         return protocol;
       }).catchError((error) {
         response
-          ..statusCode = HttpStatus.INTERNAL_SERVER_ERROR
+          ..statusCode = HttpStatus.internalServerError
           ..close();
         throw error;
       }).then<WebSocket>(upgrade);
@@ -536,15 +536,15 @@
     if (request.method != "GET") {
       return false;
     }
-    if (request.headers[HttpHeaders.CONNECTION] == null) {
+    if (request.headers[HttpHeaders.connectionHeader] == null) {
       return false;
     }
     bool isUpgrade = false;
-    request.headers[HttpHeaders.CONNECTION].forEach((String value) {
+    request.headers[HttpHeaders.connectionHeader].forEach((String value) {
       if (value.toLowerCase() == "upgrade") isUpgrade = true;
     });
     if (!isUpgrade) return false;
-    String upgrade = request.headers.value(HttpHeaders.UPGRADE);
+    String upgrade = request.headers.value(HttpHeaders.upgradeHeader);
     if (upgrade == null || upgrade.toLowerCase() != "websocket") {
       return false;
     }
@@ -964,7 +964,7 @@
 
   final _socket;
   final bool _serverSide;
-  int _readyState = WebSocket.CONNECTING;
+  int _readyState = WebSocket.connecting;
   bool _writeClosed = false;
   int _closeCode;
   String _closeReason;
@@ -981,7 +981,7 @@
 
   static Future<WebSocket> connect(
       String url, Iterable<String> protocols, Map<String, dynamic> headers,
-      {CompressionOptions compression: CompressionOptions.DEFAULT}) {
+      {CompressionOptions compression: CompressionOptions.compressionDefault}) {
     Uri uri = Uri.parse(url);
     if (uri.scheme != "ws" && uri.scheme != "wss") {
       throw new WebSocketException("Unsupported URL scheme '${uri.scheme}'");
@@ -1008,15 +1008,15 @@
         // If the URL contains user information use that for basic
         // authorization.
         String auth = _CryptoUtils.bytesToBase64(utf8.encode(uri.userInfo));
-        request.headers.set(HttpHeaders.AUTHORIZATION, "Basic $auth");
+        request.headers.set(HttpHeaders.authorizationHeader, "Basic $auth");
       }
       if (headers != null) {
         headers.forEach((field, value) => request.headers.add(field, value));
       }
       // Setup the initial handshake.
       request.headers
-        ..set(HttpHeaders.CONNECTION, "Upgrade")
-        ..set(HttpHeaders.UPGRADE, "websocket")
+        ..set(HttpHeaders.connectionHeader, "Upgrade")
+        ..set(HttpHeaders.upgradeHeader, "websocket")
         ..set("Sec-WebSocket-Key", nonce)
         ..set("Cache-Control", "no-cache")
         ..set("Sec-WebSocket-Version", "13");
@@ -1039,11 +1039,11 @@
         throw new WebSocketException(message);
       }
 
-      if (response.statusCode != HttpStatus.SWITCHING_PROTOCOLS ||
-          response.headers[HttpHeaders.CONNECTION] == null ||
-          !response.headers[HttpHeaders.CONNECTION]
+      if (response.statusCode != HttpStatus.switchingProtocols ||
+          response.headers[HttpHeaders.connectionHeader] == null ||
+          !response.headers[HttpHeaders.connectionHeader]
               .any((value) => value.toLowerCase() == "upgrade") ||
-          response.headers.value(HttpHeaders.UPGRADE).toLowerCase() !=
+          response.headers.value(HttpHeaders.upgradeHeader).toLowerCase() !=
               "websocket") {
         error("Connection to '$uri' was not upgraded to websocket");
       }
@@ -1114,7 +1114,7 @@
       [this._serverSide = false, _WebSocketPerMessageDeflate deflate]) {
     _consumer = new _WebSocketConsumer(this, _socket);
     _sink = new _StreamSinkImpl(_consumer);
-    _readyState = WebSocket.OPEN;
+    _readyState = WebSocket.open;
     _deflate = deflate;
 
     var transformer = new _WebSocketProtocolTransformer(_serverSide, _deflate);
@@ -1140,14 +1140,14 @@
       _controller.close();
     }, onDone: () {
       if (_closeTimer != null) _closeTimer.cancel();
-      if (_readyState == WebSocket.OPEN) {
-        _readyState = WebSocket.CLOSING;
+      if (_readyState == WebSocket.open) {
+        _readyState = WebSocket.closing;
         if (!_isReservedStatusCode(transformer.closeCode)) {
           _close(transformer.closeCode, transformer.closeReason);
         } else {
           _close();
         }
-        _readyState = WebSocket.CLOSED;
+        _readyState = WebSocket.closed;
       }
       // Protocol close, use close code from transformer.
       _closeCode = transformer.closeCode;
diff --git a/sdk/lib/_internal/js_runtime/lib/constant_map.dart b/sdk/lib/_internal/js_runtime/lib/constant_map.dart
index 3d92fd8..6047b2d 100644
--- a/sdk/lib/_internal/js_runtime/lib/constant_map.dart
+++ b/sdk/lib/_internal/js_runtime/lib/constant_map.dart
@@ -12,7 +12,7 @@
 abstract class ConstantMap<K, V> implements Map<K, V> {
   // Used to create unmodifiable maps from other maps.
   factory ConstantMap.from(Map other) {
-    List keys = other.keys.toList();
+    List keys = new List<K>.from(other.keys);
     bool allStrings = true;
     for (var k in keys) {
       if (k is! String) {
@@ -26,7 +26,7 @@
       var object = JS('=Object', '{}');
       int length = 0;
       for (var k in keys) {
-        var v = other[k];
+        V v = other[k];
         if (k != '__proto__') {
           if (!jsHasOwnProperty(object, k)) length++;
           JS('void', '#[#] = #', object, k, v);
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 e93af8f..7889c36 100644
--- a/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart
+++ b/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart
@@ -379,8 +379,9 @@
 // because passing unvalidated values to the native constructors can cause
 // conversions or create views.
 int _checkLength(length) {
-  if (length is! int) throw new ArgumentError('Invalid length $length');
-  return length;
+  return length is int
+      ? length
+      : throw new ArgumentError('Invalid length $length');
 }
 
 // Validates `.view` constructor arguments.  Checking is necessary because
diff --git a/sdk/lib/async/async.dart b/sdk/lib/async/async.dart
index c616cda..2fa3f1df8 100644
--- a/sdk/lib/async/async.dart
+++ b/sdk/lib/async/async.dart
@@ -88,6 +88,8 @@
  * [futures-tutorial]: https://www.dartlang.org/docs/tutorials/futures/
  * [futures-error-handling]: https://www.dartlang.org/articles/futures-and-error-handling/
  * [test-readme]: https://pub.dartlang.org/packages/test
+ *
+ * {@category Core}
  */
 library dart.async;
 
diff --git a/sdk/lib/collection/collection.dart b/sdk/lib/collection/collection.dart
index fd78f9a..7c667ec 100644
--- a/sdk/lib/collection/collection.dart
+++ b/sdk/lib/collection/collection.dart
@@ -4,10 +4,12 @@
 
 /**
  * Classes and utilities that supplement the collection support in dart:core.
- * 
+ *
  * To use this library in your code:
  *
  *     import 'dart:collection';
+ *
+ * {@category Core}
  */
 library dart.collection;
 
diff --git a/sdk/lib/convert/convert.dart b/sdk/lib/convert/convert.dart
index 1255c22..8125f34 100644
--- a/sdk/lib/convert/convert.dart
+++ b/sdk/lib/convert/convert.dart
@@ -50,6 +50,8 @@
  *
  * See the documentation for the [Codec] and [Converter] classes
  * for information about creating your own converters.
+ *
+ * {@category Core}
  */
 library dart.convert;
 
diff --git a/sdk/lib/core/core.dart b/sdk/lib/core/core.dart
index ca55d4a..7b5c901 100644
--- a/sdk/lib/core/core.dart
+++ b/sdk/lib/core/core.dart
@@ -149,6 +149,8 @@
  * The
  * [Dart Language Specification](http://www.dartlang.org/docs/spec/)
  * provides technical details.
+ *
+ * {@category Core}
  */
 library dart.core;
 
diff --git a/sdk/lib/developer/developer.dart b/sdk/lib/developer/developer.dart
index b6ec40d..6c3fa82 100644
--- a/sdk/lib/developer/developer.dart
+++ b/sdk/lib/developer/developer.dart
@@ -12,6 +12,7 @@
 ///
 ///     import 'dart:developer';
 ///
+/// {@category Core}
 library dart.developer;
 
 import 'dart:async';
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index c440394..a695e1f 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -102,40 +102,28 @@
     JS('returns:HtmlDocument;depends:none;effects:none;gvn:true', 'document');
 
 // Supoort to convert JS Promise to a Dart Future.
-Future<T> promiseToFuture<T>(thePromise) {
+Future<T> promiseToFuture<T>(jsPromise) {
   var completer = new Completer<T>();
 
   var thenSuccessCode = (promiseValue) => completer.complete(promiseValue);
   var thenErrorCode = (promiseError) => completer.completeError(promiseError);
 
-  JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1),
+  JS("", "#.then(#, #)", jsPromise, convertDartClosureToJS(thenSuccessCode, 1),
       convertDartClosureToJS(thenErrorCode, 1));
 
   return completer.future;
 }
 
-// Supoort to convert JS Promise to a Dart Future that returns a MapLike (Class with Map mixin).
-Future promiseToFutureMap(thePromise) {
-  var completer = new Completer();
-
-  var thenSuccessCode = (promiseValue) => completer.complete(promiseValue);
-  var thenErrorCode = (promiseError) => completer.completeError(promiseError);
-
-  JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1),
-      convertDartClosureToJS(thenErrorCode, 1));
-
-  return completer.future;
-}
-
-// Supoort to convert JS Promise to a Dart Future that returns a Dictionary as a Dart Map.
-Future<Map> promiseToFutureDictionary(thePromise) {
-  var completer = new Completer<Map>();
+// Supoort to convert JS Promise to a Dart Future<Map<String, dynamic>>.  Each property of the JS
+// object is added to the Map as a key of type String with a value of type dynamic.
+Future<Map<String, dynamic>> promiseToFutureAsMap(jsPromise) {
+  var completer = new Completer<Map<String, dynamic>>();
 
   var thenSuccessCode = (promiseValue) =>
       completer.complete(convertNativeToDart_Dictionary(promiseValue));
   var thenErrorCode = (promiseError) => completer.completeError(promiseError);
 
-  JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1),
+  JS("", "#.then(#, #)", jsPromise, convertDartClosureToJS(thenSuccessCode, 1),
       convertDartClosureToJS(thenErrorCode, 1));
 
   return completer.future;
@@ -23376,8 +23364,8 @@
   @DomName('ImageCapture.getPhotoSettings')
   @DocsEditable()
   @Experimental() // untriaged
-  Future<Map> getPhotoSettings() =>
-      promiseToFutureDictionary(JS("", "#.getPhotoSettings()", this));
+  Future<Map<String, dynamic>> getPhotoSettings() =>
+      promiseToFutureAsMap(JS("", "#.getPhotoSettings()", this));
 
   @DomName('ImageCapture.grabFrame')
   @DocsEditable()
@@ -28253,8 +28241,8 @@
   @DomName('NavigationPreloadManager.getState')
   @DocsEditable()
   @Experimental() // untriaged
-  Future<Map> getState() =>
-      promiseToFutureDictionary(JS("", "#.getState()", this));
+  Future<Map<String, dynamic>> getState() =>
+      promiseToFutureAsMap(JS("", "#.getState()", this));
 }
 // 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
@@ -31582,8 +31570,8 @@
   @DomName('PaymentInstruments.get')
   @DocsEditable()
   @Experimental() // untriaged
-  Future<Map> get(String instrumentKey) =>
-      promiseToFutureDictionary(JS("", "#.get(#)", this, instrumentKey));
+  Future<Map<String, dynamic>> get(String instrumentKey) =>
+      promiseToFutureAsMap(JS("", "#.get(#)", this, instrumentKey));
 
   @DomName('PaymentInstruments.has')
   @DocsEditable()
@@ -34806,7 +34794,7 @@
 
   @DomName('RTCPeerConnection.getStats')
   @DocsEditable()
-  Future getStats() => promiseToFutureMap(JS("", "#.getStats()", this));
+  Future getStats() => promiseToFuture<dynamic>(JS("", "#.getStats()", this));
 
   @DomName('RTCPeerConnection.removeStream')
   @DocsEditable()
@@ -37903,8 +37891,8 @@
   @DomName('StorageManager.estimate')
   @DocsEditable()
   @Experimental() // untriaged
-  Future<Map> estimate() =>
-      promiseToFutureDictionary(JS("", "#.estimate()", this));
+  Future<Map<String, dynamic>> estimate() =>
+      promiseToFutureAsMap(JS("", "#.estimate()", this));
 
   @DomName('StorageManager.persist')
   @DocsEditable()
@@ -47644,8 +47632,8 @@
   final List<CssClassSetImpl> _sets;
 
   factory _MultiElementCssClassSet(Iterable<Element> elements) {
-    return new _MultiElementCssClassSet._(
-        elements, elements.map((Element e) => e.classes).toList());
+    return new _MultiElementCssClassSet._(elements,
+        new List<CssClassSetImpl>.from(elements.map((Element e) => e.classes)));
   }
 
   _MultiElementCssClassSet._(this._elementIterable, this._sets);
diff --git a/sdk/lib/html/html_common/conversions_dart2js.dart b/sdk/lib/html/html_common/conversions_dart2js.dart
index 0a315ec..f99b357 100644
--- a/sdk/lib/html/html_common/conversions_dart2js.dart
+++ b/sdk/lib/html/html_common/conversions_dart2js.dart
@@ -2,9 +2,9 @@
 
 /// Converts a JavaScript object with properties into a Dart Map.
 /// Not suitable for nested objects.
-Map convertNativeToDart_Dictionary(object) {
+Map<String, dynamic> convertNativeToDart_Dictionary(object) {
   if (object == null) return null;
-  var dict = {};
+  var dict = <String, dynamic>{};
   var keys = JS('JSExtendableArray', 'Object.getOwnPropertyNames(#)', object);
   for (final key in keys) {
     dict[key] = JS('var', '#[#]', object, key);
diff --git a/sdk/lib/js_util/dart2js/js_util_dart2js.dart b/sdk/lib/js_util/dart2js/js_util_dart2js.dart
index ac832ff..6b605fb 100644
--- a/sdk/lib/js_util/dart2js/js_util_dart2js.dart
+++ b/sdk/lib/js_util/dart2js/js_util_dart2js.dart
@@ -60,14 +60,14 @@
 
 newObject() => JS('=Object', '{}');
 
-hasProperty(o, name) => JS('bool', '# in #', name, o);
+bool hasProperty(o, name) => JS('bool', '# in #', name, o);
 getProperty(o, name) => JS('Object|Null', '#[#]', o, name);
 setProperty(o, name, value) => JS('', '#[#]=#', o, name, value);
 
 callMethod(o, String method, List args) =>
     JS('Object|Null', '#[#].apply(#, #)', o, method, o, args);
 
-instanceof(o, Function type) => JS('bool', '# instanceof #', o, type);
+bool instanceof(o, Function type) => JS('bool', '# instanceof #', o, type);
 callConstructor(Function constr, List arguments) {
   if (arguments == null) {
     return JS('Object', 'new #()', constr);
diff --git a/sdk/lib/libraries.json b/sdk/lib/libraries.json
index 9f3f684..d7ed7b0 100644
--- a/sdk/lib/libraries.json
+++ b/sdk/lib/libraries.json
@@ -17,7 +17,6 @@
           "../../runtime/lib/core_patch.dart",
           "../../runtime/lib/array.dart",
           "../../runtime/lib/array_patch.dart",
-          "../../runtime/lib/bigint.dart",
           "../../runtime/lib/bigint_patch.dart",
           "../../runtime/lib/bool_patch.dart",
           "../../runtime/lib/date_patch.dart",
diff --git a/sdk/lib/libraries.yaml b/sdk/lib/libraries.yaml
index 92c2391..82a6466 100644
--- a/sdk/lib/libraries.yaml
+++ b/sdk/lib/libraries.yaml
@@ -49,7 +49,6 @@
         - "../../runtime/lib/core_patch.dart"
         - "../../runtime/lib/array.dart"
         - "../../runtime/lib/array_patch.dart"
-        - "../../runtime/lib/bigint.dart"
         - "../../runtime/lib/bigint_patch.dart"
         - "../../runtime/lib/bool_patch.dart"
         - "../../runtime/lib/date_patch.dart"
diff --git a/sdk/lib/math/math.dart b/sdk/lib/math/math.dart
index 8e0a30f..c975413 100644
--- a/sdk/lib/math/math.dart
+++ b/sdk/lib/math/math.dart
@@ -8,6 +8,8 @@
  * To use this library in your code:
  *
  *     import 'dart:math';
+ *
+ * {@category Core}
  */
 library dart.math;
 
diff --git a/sdk/lib/typed_data/typed_data.dart b/sdk/lib/typed_data/typed_data.dart
index d4a1e0e..3b284b5 100644
--- a/sdk/lib/typed_data/typed_data.dart
+++ b/sdk/lib/typed_data/typed_data.dart
@@ -8,6 +8,8 @@
 /// To use this library in your code:
 ///
 ///     import 'dart:typed_data';
+///
+/// {@category Core}
 library dart.typed_data;
 
 import "dart:_internal" show UnmodifiableListBase;
diff --git a/sdk/lib/vmservice/client.dart b/sdk/lib/vmservice/client.dart
index 7e0fdd8..efe33c0 100644
--- a/sdk/lib/vmservice/client.dart
+++ b/sdk/lib/vmservice/client.dart
@@ -41,7 +41,7 @@
   void onRequest(Message message) {
     // In JSON-RPC 2.0 messages with and id are Request and must be answered
     // http://www.jsonrpc.org/specification#notification
-    service.routeRequest(message).then(post);
+    service.routeRequest(service, message).then(post);
   }
 
   void onResponse(Message message) {
@@ -53,7 +53,7 @@
     // In JSON-RPC 2.0 messages without an id are Notification
     // and should not be answered
     // http://www.jsonrpc.org/specification#notification
-    service.routeRequest(message);
+    service.routeRequest(service, message);
   }
 
   // Sends a result to the client.  Implemented in subclasses.
diff --git a/sdk/lib/vmservice/message_router.dart b/sdk/lib/vmservice/message_router.dart
index 21368a6..7248303 100644
--- a/sdk/lib/vmservice/message_router.dart
+++ b/sdk/lib/vmservice/message_router.dart
@@ -5,7 +5,7 @@
 part of dart._vmservice;
 
 abstract class MessageRouter {
-  Future<Response> routeRequest(Message message);
+  Future<Response> routeRequest(VMService service, Message message);
   void routeResponse(Message message);
 }
 
diff --git a/sdk/lib/vmservice/running_isolate.dart b/sdk/lib/vmservice/running_isolate.dart
index a1339f0..8a6dd36 100644
--- a/sdk/lib/vmservice/running_isolate.dart
+++ b/sdk/lib/vmservice/running_isolate.dart
@@ -13,10 +13,12 @@
 
   String get serviceId => 'isolates/$portId';
 
-  Future<Response> routeRequest(Message message) {
+  @override
+  Future<Response> routeRequest(VMService service, Message message) {
     // Send message to isolate.
     return message.sendToIsolate(sendPort);
   }
 
+  @override
   void routeResponse(Message message) {}
 }
diff --git a/sdk/lib/vmservice/running_isolates.dart b/sdk/lib/vmservice/running_isolates.dart
index 8f284d8..1b44ee3 100644
--- a/sdk/lib/vmservice/running_isolates.dart
+++ b/sdk/lib/vmservice/running_isolates.dart
@@ -25,7 +25,8 @@
     isolates.remove(portId);
   }
 
-  Future<Response> routeRequest(Message message) {
+  @override
+  Future<Response> routeRequest(VMService service, Message message) {
     String isolateParam = message.params['isolateId'];
     int isolateId;
     if (!isolateParam.startsWith('isolates/')) {
@@ -57,8 +58,139 @@
       message.setResponse(encodeResult(message, result));
       return message.response;
     }
-    return isolate.routeRequest(message);
+
+    if (message.method == 'evaluateInFrame') {
+      return new _Evaluator(message, isolate, service).run();
+    } else {
+      return isolate.routeRequest(service, message);
+    }
   }
 
+  @override
   void routeResponse(Message message) {}
 }
+
+/// Class that knows how to orchestrate expression evaluation in dart2 world.
+class _Evaluator {
+  _Evaluator(this._message, this._isolate, this._service);
+
+  Future<Response> run() async {
+    Response buildScopeResponse = await _buildScope();
+    dynamic responseJson = buildScopeResponse.decodeJson();
+    String kernelBase64;
+    try {
+      kernelBase64 = await _compileExpression(responseJson['result']);
+    } catch (e) {
+      return Response.from(encodeCompilationError(_message, e.toString()));
+    }
+    return _evaluateCompiledExpression(kernelBase64);
+  }
+
+  Message _message;
+  RunningIsolate _isolate;
+  VMService _service;
+
+  Future<Response> _buildScope() {
+    Map buildScopeParams = {
+      'method': '_buildExpressionEvaluationScope',
+      'id': _message.serial,
+      'params': {
+        'isolateId': _message.params['isolateId'],
+        'frameIndex': _message.params['frameIndex'],
+      },
+    };
+    if (_message.params['scope'] != null) {
+      buildScopeParams['params']['scope'] = _message.params['scope'];
+    }
+    var buildScope =
+        new Message._fromJsonRpcRequest(_message.client, buildScopeParams);
+
+    // Decode the JSON and and insert it into the map. The map key
+    // is the request Uri.
+    return _isolate.routeRequest(_service, buildScope);
+  }
+
+  Future<String> _compileExpression(
+      Map<String, dynamic> buildScopeResponseResult) {
+    Client externalClient =
+        _service._findFirstClientThatHandlesService('compileExpression');
+
+    Map compileParams = {
+      'isolateId': _message.params['isolateId'],
+      'expression': _message.params['expression'],
+      'definitions': buildScopeResponseResult['param_names'],
+      'typeDefinitions': buildScopeResponseResult['type_params_names'],
+      'libraryUri': buildScopeResponseResult['libraryUri'],
+      'isStatic': buildScopeResponseResult['isStatic'],
+    };
+    dynamic klass = buildScopeResponseResult['klass'];
+    if (klass != null) {
+      compileParams['klass'] = klass;
+    }
+    if (externalClient != null) {
+      var compileExpression = new Message.forMethod('compileExpression');
+      compileExpression.client = externalClient;
+      compileExpression.params.addAll(compileParams);
+
+      final id = _service._serviceRequests.newId();
+      final oldId = _message.serial;
+      final completer = new Completer<String>();
+      externalClient.serviceHandles[id] = (Message m) {
+        if (m != null) {
+          completer.complete(json.encode(m.forwardToJson({'id': oldId})));
+        } else {
+          completer.complete(encodeRpcError(_message, kServiceDisappeared));
+        }
+      };
+      externalClient.post(new Response.json(compileExpression
+          .forwardToJson({'id': id, 'method': 'compileExpression'})));
+      return completer.future
+          .then((String s) => jsonDecode(s))
+          .then((dynamic json) {
+        return json['result']['result']['kernelBytes'];
+      });
+    } else {
+      // fallback to compile using kernel service
+      Map compileExpressionParams = {
+        'method': '_compileExpression',
+        'id': _message.serial,
+        'params': compileParams,
+      };
+      var compileExpression = new Message._fromJsonRpcRequest(
+          _message.client, compileExpressionParams);
+
+      return _isolate
+          .routeRequest(_service, compileExpression)
+          .then((Response response) => response.decodeJson())
+          .then((dynamic json) {
+        if (json['result'] != null) {
+          return json['result']['kernelBytes'];
+        }
+        throw json['error']['data']['details'];
+      });
+    }
+  }
+
+  Future<Response> _evaluateCompiledExpression(String kernelBase64) {
+    if (kernelBase64.isNotEmpty) {
+      Map runParams = {
+        'method': '_evaluateCompiledExpression',
+        'id': _message.serial,
+        'params': {
+          'isolateId': _message.params['isolateId'],
+          'frameIndex': _message.params['frameIndex'],
+          'kernelBytes': kernelBase64,
+        },
+      };
+      if (_message.params['scope'] != null) {
+        runParams['params']['scope'] = _message.params['scope'];
+      }
+      var runExpression =
+          new Message._fromJsonRpcRequest(_message.client, runParams);
+      return _isolate.routeRequest(_service, runExpression); // _message
+    } else {
+      // empty kernel indicates dart1 mode
+      return _isolate.routeRequest(_service, _message);
+    }
+  }
+}
diff --git a/sdk/lib/vmservice/vmservice.dart b/sdk/lib/vmservice/vmservice.dart
index a59e7ca..f321876 100644
--- a/sdk/lib/vmservice/vmservice.dart
+++ b/sdk/lib/vmservice/vmservice.dart
@@ -68,8 +68,10 @@
 const kCannotResume = 107;
 const kIsolateIsReloading = 108;
 const kIsolateReloadBarred = 109;
-const kServiceAlreadyRegistered = 110;
-const kServiceDisappeared = 111;
+const kIsolateMustHaveReloaded = 110;
+const kServiceAlreadyRegistered = 111;
+const kServiceDisappeared = 112;
+const kExpressionCompilationError = 113;
 
 // Experimental (used in private rpcs).
 const kFileSystemAlreadyExists = 1001;
@@ -87,6 +89,7 @@
   kFileDoesNotExist: 'File does not exist',
   kServiceAlreadyRegistered: 'Service already registered',
   kServiceDisappeared: 'Service has disappeared',
+  kExpressionCompilationError: 'Expression compilation error',
 };
 
 String encodeRpcError(Message message, int code, {String details}) {
@@ -117,6 +120,11 @@
       details: "${message.method}: invalid '${param}' parameter: ${value}");
 }
 
+String encodeCompilationError(Message message, String diagnostic) {
+  return encodeRpcError(message, kExpressionCompilationError,
+      details: diagnostic);
+}
+
 String encodeResult(Message message, Map result) {
   var response = {
     'jsonrpc': '2.0',
@@ -233,7 +241,7 @@
             }
           }));
     }
-    // Complete all requestes as failed
+    // Complete all requests as failed
     for (var handle in client.serviceHandles.values) {
       handle(null);
     }
@@ -358,6 +366,17 @@
     return false;
   }
 
+  Client _findFirstClientThatHandlesService(String service) {
+    if (clients != null) {
+      for (Client c in clients) {
+        if (c.services.containsKey(service)) {
+          return c;
+        }
+      }
+    }
+    return null;
+  }
+
   static const kServiceStream = '_Service';
   static const serviceStreams = const [kServiceStream];
 
@@ -571,13 +590,13 @@
         var message = new Message.forIsolate(client, request, isolate);
         // Decode the JSON and and insert it into the map. The map key
         // is the request Uri.
-        var response = (await isolate.routeRequest(message)).decodeJson();
+        var response = (await isolate.routeRequest(this, message)).decodeJson();
         responses[message.toUri().toString()] = response['result'];
       }
       // Dump the object id ring requests.
       var message =
           new Message.forIsolate(client, Uri.parse('_dumpIdZone'), isolate);
-      var response = (await isolate.routeRequest(message)).decodeJson();
+      var response = (await isolate.routeRequest(this, message)).decodeJson();
       // Insert getObject requests into responses map.
       for (var object in response['result']['objects']) {
         final requestUri =
@@ -590,7 +609,7 @@
     return encodeResult(message, responses);
   }
 
-  Future<Response> routeRequest(Message message) async {
+  Future<Response> routeRequest(VMService _, Message message) async {
     return new Response.from(await _routeRequestImpl(message));
   }
 
@@ -622,7 +641,7 @@
         return await _handleService(message);
       }
       if (message.params['isolateId'] != null) {
-        return await runningIsolates.routeRequest(message);
+        return await runningIsolates.routeRequest(this, message);
       }
       return await message.sendToVM();
     } catch (e, st) {
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 74c7866..e85002f 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -1367,15 +1367,12 @@
 WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-001_t01: RuntimeError # Please triage this failure
 
 [ $compiler == dart2js && $runtime == chrome && $csp && $minified ]
-LayoutTests/fast/css/fontface-properties_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/inherited-properties-rare-text_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLScriptElement/isURLAttribute_t01: SkipByDesign # Uses script injection
 LayoutTests/fast/dom/HTMLScriptElement/remove-source_t01: Pass # Please triage this failure
 LayoutTests/fast/dom/HTMLScriptElement/script-for-attribute-unexpected-execution_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLScriptElement/script-reexecution_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLTemplateElement/inertContents_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Range/create-contextual-fragment-script-unmark-already-started_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/elementfrompoint_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/files/workers/inline-worker-via-blob-url_t01: SkipByDesign # inlined script
 LayoutTests/fast/loader/scroll-position-restored-on-back_t01: Skip # Timeout. Please triage this failure
 WebPlatformTest/webstorage/event_local_key_t01: Skip # Timeout. Please triage this failure.
@@ -7053,6 +7050,7 @@
 LayoutTests/fast/canvas/rgba-parsing_t01: Pass, RuntimeError
 LibTest/core/Invocation/namedArguments_A01_t01: RuntimeError
 LibTest/core/double/isInfinite_A01_t03: CompileTimeError # Larger than 64 bit int
+LibTest/core/double/operator_GE_A01_t02: RuntimeError # WontFix: Not representable in JS.
 LibTest/core/int/abs_A01_t01: CompileTimeError # Larger than 64 bit int
 LibTest/core/int/ceilToDouble_A01_t01: CompileTimeError # Larger than 64 bit int
 LibTest/core/int/ceil_A01_t01: CompileTimeError # Larger than 64 bit int
@@ -7105,6 +7103,7 @@
 LibTest/html/Window/requestFileSystem_A01_t01: Crash
 LibTest/html/Window/requestFileSystem_A01_t02: Crash
 LibTest/html/Window/requestFileSystem_A02_t01: Crash
+LibTest/math/pow_A09_t01: RuntimeError # WontFix: Not representable in JS.
 LibTest/math/pow_A10_t01: CompileTimeError # Larger than 64 bit int
 WebPlatformTest/html/semantics/embedded-content/the-audio-element/audio_constructor_t01: RuntimeError
 
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index 94f990f..4f64cd4 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -147,8 +147,6 @@
 Language/Classes/Constructors/Factories/default_value_t01: MissingCompileTimeError
 Language/Classes/Constructors/Factories/default_value_t02: MissingCompileTimeError
 Language/Classes/Constructors/Factories/function_type_t02: CompileTimeError
-Language/Classes/Constructors/Factories/name_t03: MissingCompileTimeError
-Language/Classes/Constructors/Factories/name_t05: MissingCompileTimeError
 Language/Classes/Constructors/Factories/redirecting_constructor_call_t01: CompileTimeError
 Language/Classes/Constructors/Factories/redirecting_constructor_call_t02: CompileTimeError
 Language/Classes/Constructors/Factories/return_type_t02: CompileTimeError
@@ -1686,10 +1684,6 @@
 Language/Classes/Constructors/Factories/const_modifier_t02: MissingCompileTimeError
 Language/Classes/Constructors/Factories/default_value_t01: MissingCompileTimeError
 Language/Classes/Constructors/Factories/default_value_t02: MissingCompileTimeError
-Language/Classes/Constructors/Factories/name_t01: MissingCompileTimeError
-Language/Classes/Constructors/Factories/name_t03: MissingCompileTimeError
-Language/Classes/Constructors/Factories/name_t04: MissingCompileTimeError
-Language/Classes/Constructors/Factories/name_t05: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/execution_t04: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/execution_t06: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/execution_t07: MissingCompileTimeError
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 2dd3260..3ff64e2 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -244,6 +244,9 @@
 LibTest/collection/ListMixin/ListMixin_class_A01_t02: Skip # Timeout
 LibTest/core/Uri/Uri_A06_t03: Skip # Timeout
 
+[ $compiler == app_jit || $compiler == none || $compiler == precompiler ]
+Language/Expressions/Function_Invocation/async_invokation_t02: RuntimeError # sync-async is on by default.
+
 [ $compiler == app_jit || $compiler == precompiler ]
 Language/Mixins/Mixin_Application/error_t01: Pass
 Language/Mixins/Mixin_Application/error_t02: Pass
@@ -420,3 +423,8 @@
 LibTest/core/Uri/encodeQueryComponent_A01_t02: Pass, Timeout
 LibTest/isolate/Isolate/spawn_A01_t04: Pass, Timeout
 LibTest/isolate/ReceivePort/take_A01_t02: Skip # Issue 27773
+
+[ $hot_reload || $hot_reload_rollback ]
+LibTest/isolate/ReceivePort/firstWhere_A01_t01: Crash # Issue 33363
+LibTest/isolate/ReceivePort/firstWhere_A02_t01: Crash # Issue 33363
+LibTest/isolate/ReceivePort/lastWhere_A02_t01: Crash # Issue 33363
diff --git a/tests/compiler/dart2js/codegen/class_codegen_test.dart b/tests/compiler/dart2js/codegen/class_codegen_test.dart
index b27fda4..63f28ba 100644
--- a/tests/compiler/dart2js/codegen/class_codegen_test.dart
+++ b/tests/compiler/dart2js/codegen/class_codegen_test.dart
@@ -38,13 +38,14 @@
 """;
 
 const String TEST_FOUR = r"""
+var g = 0;
 class A {
-  var x;
+  var x = g++;
 }
 
 class B extends A {
-  var y;
-  var z;
+  var y = g++;
+  var z = g++;
 }
 
 main() {
diff --git a/tests/compiler/dart2js/impact/data/jsinterop.dart b/tests/compiler/dart2js/impact/data/jsinterop.dart
index b063cee..3c966dd 100644
--- a/tests/compiler/dart2js/impact/data/jsinterop.dart
+++ b/tests/compiler/dart2js/impact/data/jsinterop.dart
@@ -7,8 +7,9 @@
 
 import 'package:js/js.dart';
 
-/*element: main:static=[testJsInteropClass(0),testJsInteropMethod(0)]*/
+/*element: main:static=[testJsInteropClass(0),testJsInteropMethod(0),testOptionalGenericFunctionTypeArgument(0)]*/
 main() {
+  testOptionalGenericFunctionTypeArgument();
   testJsInteropMethod();
   testJsInteropClass();
 }
@@ -30,6 +31,7 @@
     native:DomError,
     native:DomException,
     native:ErrorEvent,
+    native:GenericClass<dynamic>,
     native:JsInteropClass,
     native:MediaError,
     native:NavigatorUserMediaError,
@@ -45,6 +47,7 @@
     native:DomError,
     native:DomException,
     native:ErrorEvent,
+    native:GenericClass<dynamic>,
     native:JsInteropClass,
     native:MediaError,
     native:NavigatorUserMediaError,
@@ -60,3 +63,38 @@
 
 /*element: testJsInteropClass:dynamic=[method(0)],static=[JsInteropClass.(0)]*/
 testJsInteropClass() => new JsInteropClass().method();
+
+typedef void Callback<T>(T value);
+
+/*element: GenericClass.:static=[JavaScriptObject.(0)]*/
+@JS()
+class GenericClass<T> {
+  /*kernel.element: GenericClass.method:
+   type=[
+    check:GenericClass<dynamic>,
+    check:void Function(GenericClass.T),
+    inst:JSNull]
+  */
+  /*strong.element: GenericClass.method:
+   static=[
+    checkSubtype,
+    getRuntimeTypeArgument,
+    getRuntimeTypeArgumentIntercepted,
+    getRuntimeTypeInfo,
+    getTypeArgumentByIndex,
+    setRuntimeTypeInfo],
+   type=[
+    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]);
+}
+
+/*element: testOptionalGenericFunctionTypeArgument:dynamic=[method(0)],static=[GenericClass.(0)]*/
+testOptionalGenericFunctionTypeArgument() => new GenericClass().method();
diff --git a/tests/compiler/dart2js/inference/side_effects_test.dart b/tests/compiler/dart2js/inference/side_effects_test.dart
index 05f713e..3920656 100644
--- a/tests/compiler/dart2js/inference/side_effects_test.dart
+++ b/tests/compiler/dart2js/inference/side_effects_test.dart
@@ -9,6 +9,7 @@
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
 import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/js_backend/inferred_data.dart';
 import 'package:compiler/src/kernel/element_map.dart';
 import 'package:compiler/src/kernel/kernel_backend_strategy.dart';
 import 'package:compiler/src/world.dart';
@@ -28,11 +29,11 @@
 }
 
 abstract class ComputeValueMixin<T> {
-  JClosedWorld get closedWorld;
+  InferredData get inferredData;
 
   String getMemberValue(MemberEntity member) {
     if (member is FunctionEntity) {
-      return closedWorld.getSideEffectsOfElement(member).toString();
+      return inferredData.getSideEffectsOfElement(member).toString();
     }
     return null;
   }
@@ -52,7 +53,8 @@
           actualMap,
           elementMap,
           compiler.backendClosedWorldForTesting,
-          backendStrategy.closureDataLookup as ClosureDataLookup<ir.Node>)
+          backendStrategy.closureDataLookup as ClosureDataLookup<ir.Node>,
+          compiler.globalInference.inferredData)
       .run(definition.node);
 }
 
@@ -62,13 +64,15 @@
   final JClosedWorld closedWorld;
   final KernelToElementMapForBuilding _elementMap;
   final ClosureDataLookup<ir.Node> _closureDataLookup;
+  final InferredData inferredData;
 
   SideEffectsIrComputer(
       DiagnosticReporter reporter,
       Map<Id, ActualData> actualMap,
       this._elementMap,
       this.closedWorld,
-      this._closureDataLookup)
+      this._closureDataLookup,
+      this.inferredData)
       : super(reporter, actualMap);
 
   @override
diff --git a/tests/compiler/dart2js/rti/emission/constructor_argument_static_strong.dart b/tests/compiler/dart2js/rti/emission/constructor_argument_static_strong.dart
new file mode 100644
index 0000000..37dfefe
--- /dev/null
+++ b/tests/compiler/dart2js/rti/emission/constructor_argument_static_strong.dart
@@ -0,0 +1,51 @@
+// 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:meta/dart2js.dart';
+
+/*class: A1:checks=[],instance*/
+class A1 {}
+
+// Constructor calls are always statically invoked, so there is no checks at the
+// entry and the `Test1` constructor does not cause any checks.
+/*class: B1:checks=[],instance*/
+class B1 implements A1 {}
+
+/*class: Test1:checks=[],instance*/
+class Test1 {
+  A1 x;
+  @noInline
+  Test1(this.x);
+}
+
+/*class: A2:checks=[],instance*/
+class A2 {}
+
+// Constructor bodies are always statically resolved, so there is no checks at
+// the entry and the `Test2` constructor body does not cause any checks.
+/*class: B2:checks=[],instance*/
+class B2 implements A2 {}
+
+/*class: Test2:checks=[]*/
+abstract class Test2 {
+  @noInline
+  Test2(A2 x) {
+    print(x);
+  }
+}
+
+/*class: Use:checks=[],instance*/
+class Use extends Test2 {
+  Use.A2() : super(new A2());
+  Use.B2() : super(new B2());
+}
+
+main() {
+  new Test1(new A1());
+  new Test1(new B1());
+  new Test1(null);
+
+  new Use.A2();
+  new Use.B2();
+}
diff --git a/tests/compiler/dart2js/rti/emission/static_argument_strong.dart b/tests/compiler/dart2js/rti/emission/static_argument_strong.dart
new file mode 100644
index 0000000..7bdc190
--- /dev/null
+++ b/tests/compiler/dart2js/rti/emission/static_argument_strong.dart
@@ -0,0 +1,34 @@
+// 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:meta/dart2js.dart';
+
+/*class: I1:checkedInstance*/
+class I1 {}
+
+/*class: I2:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
+class I2 {}
+
+// TODO(32954): Exclude $isI1 because foo is only called directly.
+/*class: A:checks=[$isI1,$isI2],instance*/
+class A implements I1, I2 {}
+
+// TODO(32954): Exclude $isI1 because foo is only called directly.
+/*class: B:checks=[$isI1,$isI2],instance*/
+class B implements I1, I2 {}
+
+@noInline
+void foo(I1 x) {}
+
+@noInline
+void bar(I2 x) {}
+
+main() {
+  dynamic f = bar;
+
+  foo(new A());
+  foo(new B());
+  f(new A());
+  f(new B());
+}
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index c89576d..a6970b9 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -66,6 +66,7 @@
 from_environment_const_type_test/16: MissingCompileTimeError # Flutter Issue 9111
 from_environment_const_type_test/none: Fail # Flutter Issue 9111
 int_from_environment2_test: Fail # Flutter Issue 9111
+int_from_environment_int64_test: Fail # Flutter Issue 9111
 int_from_environment_test: Fail # Flutter Issue 9111
 main_test: RuntimeError # Flutter Issue 9111
 string_from_environment2_test: Fail # Flutter Issue 9111
@@ -212,8 +213,6 @@
 cast_test: RuntimeError
 error_stack_trace1_test: RuntimeError
 growable_list_test: RuntimeError
-int_parse_radix_test/01: RuntimeError
-int_parse_radix_test/02: RuntimeError
 integer_to_radix_string_test/01: RuntimeError
 integer_to_radix_string_test/02: RuntimeError
 integer_to_radix_string_test/none: RuntimeError
@@ -225,19 +224,21 @@
 string_split_test/checkedstore: RuntimeError
 symbol_reserved_word_test/03: RuntimeError # Issue 19972, new Symbol('void') should be allowed.
 uri_base_test: Crash # RangeError (index): Invalid value: Valid value range is empty: 0
-uri_parameters_all_test: RuntimeError
-uri_test: RuntimeError
 
 [ $compiler == dart2js && $fasta ]
-int_from_environment_test: Pass # Issue 31762
-int_parse_radix_test/none: Pass # Issue 31762
+int_from_environment_int64_test: RuntimeError # WontFix: Int not precisely representable in JS
+int_parse_radix_int64_test/01: RuntimeError # WontFix: Int not precisely representable in JS
+int_parse_radix_int64_test/02: RuntimeError # WontFix: Int not precisely representable in JS
+int_parse_radix_int64_test/none: RuntimeError # WontFix: Int not precisely representable in JS
+int_parse_radix_test/01: RuntimeError
+int_parse_radix_test/badTypes: RuntimeError # Issue 33351
+int_parse_radix_test/none: RuntimeError # Issue 33351
+int_try_parse_int64_test: RuntimeError # WontFix: Int not precisely representable in JS
 
 [ $compiler == dart2js && $fasta && $host_checked && $strong ]
 cast_test: RuntimeError
 error_stack_trace1_test: RuntimeError # Issue 12399
 growable_list_test: RuntimeError # Concurrent modifications test always runs
-int_parse_radix_test/01: RuntimeError
-int_parse_radix_test/02: RuntimeError
 integer_to_radix_string_test/01: RuntimeError
 integer_to_radix_string_test/02: RuntimeError
 integer_to_radix_string_test/none: RuntimeError
@@ -251,8 +252,6 @@
 string_split_test/checkedstore: RuntimeError # Issue 30548: does not check stores into List<String>
 symbol_reserved_word_test/03: RuntimeError # Issue 19972, new Symbol('void') should be allowed.
 uri_base_test: RuntimeError
-uri_parameters_all_test: RuntimeError
-uri_test: RuntimeError
 
 [ $compiler == dart2js && $fasta && $minified && $strong ]
 cast_test: RuntimeError
@@ -260,7 +259,6 @@
 error_stack_trace1_test: RuntimeError # Issue 12399
 growable_list_test: RuntimeError # Concurrent modifications test always runs
 hash_set_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(_CustomHashSet.#x), local(_CustomHashSet.#)) for j:closure_call(_CustomHashSet__CustomHashSet_closure.call).
-int_parse_radix_test/01: RuntimeError
 int_parse_radix_test/02: RuntimeError
 integer_to_radix_string_test/01: RuntimeError
 integer_to_radix_string_test/02: RuntimeError
@@ -278,8 +276,6 @@
 symbol_operator_test/none: RuntimeError
 symbol_reserved_word_test/03: RuntimeError # Issue 19972, new Symbol('void') should be allowed.
 uri_base_test: RuntimeError
-uri_parameters_all_test: RuntimeError
-uri_test: RuntimeError
 
 [ $compiler == dart2js && $fasta && !$strong ]
 *: SkipByDesign
@@ -304,9 +300,6 @@
 string_replace_static_test: MissingCompileTimeError
 string_static_test: MissingCompileTimeError
 
-[ $compiler == dartk && $mode == debug && $hot_reload ]
-map_test: Crash
-
 [ $compiler == dartk && $mode == release && $hot_reload ]
 bigint_parse_radix_test: Crash
 
@@ -408,14 +401,14 @@
 typed_data_with_limited_ints_test: Skip # Requires fixed-size int64 support.
 
 [ $runtime != none && ($compiler == dartdevc || $compiler == dartdevk) ]
-bigint_test: Pass, Slow
+bigint_test: Pass, Slow, Timeout
 compare_to2_test: RuntimeError # Issue 30170
 date_time10_test: RuntimeError # Issue 29921
 error_stack_trace_test/nullThrown: RuntimeError # .stackTrace not present for exception caught from 'throw null;'
 hash_set_test/01: RuntimeError # Issue 29921
 int_modulo_arith_test/none: RuntimeError # Issue 29921
+int_parse_radix_int64_test/02: RuntimeError
 int_parse_radix_test/01: RuntimeError # Issue 29921
-int_parse_radix_test/02: RuntimeError # Issue 29921
 int_parse_with_limited_ints_test: Skip # Requires fixed-size int64 support.
 integer_arith_vm_test/modPow: RuntimeError # Issue 30170
 integer_parsed_arith_vm_test: RuntimeError # Issue 29921
@@ -473,6 +466,7 @@
 symbol_reserved_word_test/12: RuntimeError # Issue 29921
 symbol_test/none: RuntimeError # Issue 29921
 typed_data_with_limited_ints_test: Skip # Requires fixed-size int64 support.
+uri_parse_test: Pass, Slow
 
 [ $runtime == vm && !$strong ]
 collection_of_test: RuntimeError
diff --git a/tests/corelib_2/int_from_environment_int64_test.dart b/tests/corelib_2/int_from_environment_int64_test.dart
new file mode 100644
index 0000000..b734556
--- /dev/null
+++ b/tests/corelib_2/int_from_environment_int64_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.
+// SharedOptions=-Df=-9223372036854775808 -Dg=9223372036854775807
+
+import "package:expect/expect.dart";
+
+main() {
+  Expect.equals(-9223372036854775808, const int.fromEnvironment('f'));
+  Expect.equals(9223372036854775807, const int.fromEnvironment('g'));
+}
diff --git a/tests/corelib_2/int_from_environment_test.dart b/tests/corelib_2/int_from_environment_test.dart
index 5628ccd..62b1f1a 100644
--- a/tests/corelib_2/int_from_environment_test.dart
+++ b/tests/corelib_2/int_from_environment_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// SharedOptions=-Da=1 -Db=-12 -Dc=0x123 -Dd=-0x1234 -De=+0x112296 -Df=-9223372036854775808 -Dg=9223372036854775807
+// SharedOptions=-Da=1 -Db=-12 -Dc=0x123 -Dd=-0x1234 -De=+0x112296 -Df=-9007199254740991 -Dg=9007199254740991
 
 import "package:expect/expect.dart";
 
@@ -11,6 +11,6 @@
   Expect.equals(0x123, const int.fromEnvironment('c'));
   Expect.equals(-0x1234, const int.fromEnvironment('d'));
   Expect.equals(0x112296, const int.fromEnvironment('e'));
-  Expect.equals(-9223372036854775808, const int.fromEnvironment('f'));
-  Expect.equals(9223372036854775807, const int.fromEnvironment('g'));
+  Expect.equals(-9007199254740991, const int.fromEnvironment('f'));
+  Expect.equals(9007199254740991, const int.fromEnvironment('g'));
 }
diff --git a/tests/corelib_2/int_parse_radix_int64_test.dart b/tests/corelib_2/int_parse_radix_int64_test.dart
new file mode 100644
index 0000000..7a6fe18
--- /dev/null
+++ b/tests/corelib_2/int_parse_radix_int64_test.dart
@@ -0,0 +1,68 @@
+// 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";
+import "dart:math" show pow, log;
+
+void main() {
+  const String oneByteWhiteSpace = "\x09\x0a\x0b\x0c\x0d\x20"
+      "\x85" //# 01: ok
+      "\xa0";
+  const String whiteSpace = "$oneByteWhiteSpace\u1680"
+      "\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a"
+      "\u2028\u2029\u202f\u205f\u3000\ufeff";
+
+  var digits = "0123456789abcdefghijklmnopqrstuvwxyz";
+  var zeros = "0" * 64;
+
+  void testParse(int result, String radixString, int radix) {
+    var m = "$radixString/$radix->$result";
+    Expect.equals(
+        result, int.parse(radixString.toLowerCase(), radix: radix), m);
+    Expect.equals(
+        result, int.parse(radixString.toUpperCase(), radix: radix), m);
+    Expect.equals(result, int.parse(" $radixString", radix: radix), m);
+    Expect.equals(result, int.parse("$radixString ", radix: radix), m);
+    Expect.equals(result, int.parse(" $radixString ", radix: radix), m);
+    Expect.equals(result, int.parse("+$radixString", radix: radix), m);
+    Expect.equals(result, int.parse(" +$radixString", radix: radix), m);
+    Expect.equals(result, int.parse("+$radixString ", radix: radix), m);
+    Expect.equals(result, int.parse(" +$radixString ", radix: radix), m);
+    Expect.equals(-result, int.parse("-$radixString", radix: radix), m);
+    Expect.equals(-result, int.parse(" -$radixString", radix: radix), m);
+    Expect.equals(-result, int.parse("-$radixString ", radix: radix), m);
+    Expect.equals(-result, int.parse(" -$radixString ", radix: radix), m);
+    Expect.equals(
+        result,
+        int.parse("$oneByteWhiteSpace$radixString$oneByteWhiteSpace",
+            radix: radix),
+        m);
+    Expect.equals(
+        -result,
+        int.parse("$oneByteWhiteSpace-$radixString$oneByteWhiteSpace",
+            radix: radix),
+        m);
+    Expect.equals(result,
+        int.parse("$whiteSpace$radixString$whiteSpace", radix: radix), m);
+    Expect.equals(-result,
+        int.parse("$whiteSpace-$radixString$whiteSpace", radix: radix), m);
+
+    Expect.equals(result, int.parse("$zeros$radixString", radix: radix), m);
+    Expect.equals(result, int.parse("+$zeros$radixString", radix: radix), m);
+    Expect.equals(-result, int.parse("-$zeros$radixString", radix: radix), m);
+  }
+
+  final max = 9223372036854775807;
+  for (int i = 2; i <= 36; i++) { //             //# 02: ok
+    // Test with bignums. //                     //# 02: continued
+    final n = (log(max) / log(i)).truncate(); // //# 02: continued
+    var digit = digits[i - 1]; //                //# 02: continued
+    testParse(pow(i, n) - 1, digit * n, i); //   //# 02: continued
+    testParse(0, zeros, i); //                   //# 02: continued
+  } //                                           //# 02: continued
+
+  // Big number.
+  Expect.equals(9223372036854775807, int.parse("9223372036854775807"));
+  Expect.equals(-9223372036854775808, int.parse("-9223372036854775808"));
+}
diff --git a/tests/corelib_2/int_parse_radix_test.dart b/tests/corelib_2/int_parse_radix_test.dart
index cf49135..d7ca92a 100644
--- a/tests/corelib_2/int_parse_radix_test.dart
+++ b/tests/corelib_2/int_parse_radix_test.dart
@@ -65,7 +65,7 @@
     }
   }
 
-  final max = 9223372036854775807;
+  final max = 0x1FFFFFFFFFFFFF;
   for (int i = 2; i <= 36; i++) { //             //# 02: ok
     // Test with bignums. //                     //# 02: continued
     final n = (log(max) / log(i)).truncate(); // //# 02: continued
@@ -78,8 +78,9 @@
   Expect.equals(0xABCD, int.parse("ABCD", radix: 16));
   Expect.equals(0xABCD, int.parse("abcd", radix: 16));
   Expect.equals(15628859, int.parse("09azAZ", radix: 36));
-  // Big number.
-  Expect.equals(9223372036854775807, int.parse("9223372036854775807"));
+  // Big-ish number. (2^53)
+  Expect.equals(9007199254740991, int.parse("9007199254740991"));
+  Expect.equals(-9007199254740991, int.parse("-9007199254740991"));
   Expect.equals(-9223372036854775808, int.parse("-9223372036854775808"));
   // Allow whitespace before and after the number.
   Expect.equals(1, int.parse(" 1", radix: 2));
diff --git a/tests/corelib_2/int_try_parse_int64_test.dart b/tests/corelib_2/int_try_parse_int64_test.dart
new file mode 100644
index 0000000..419da75
--- /dev/null
+++ b/tests/corelib_2/int_try_parse_int64_test.dart
@@ -0,0 +1,12 @@
+// 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";
+import "dart:math" show pow, log;
+
+void main() {
+  // Big numbers (representable as both Int64 and double).
+  Expect.equals(9223372036854774784, int.tryParse("9223372036854774784"));
+  Expect.equals(-9223372036854775808, int.tryParse("-9223372036854775808"));
+}
diff --git a/tests/corelib_2/int_try_parse_test.dart b/tests/corelib_2/int_try_parse_test.dart
index eb1fc86..3d9d294 100644
--- a/tests/corelib_2/int_try_parse_test.dart
+++ b/tests/corelib_2/int_try_parse_test.dart
@@ -87,9 +87,9 @@
   Expect.equals(0xABCD, int.tryParse("ABCD", radix: 16));
   Expect.equals(0xABCD, int.tryParse("abcd", radix: 16));
   Expect.equals(15628859, int.tryParse("09azAZ", radix: 36));
-  // Big numbers (representable as both Int64 and double).
-  Expect.equals(9223372036854774784, int.tryParse("9223372036854774784"));
-  Expect.equals(-9223372036854775808, int.tryParse("-9223372036854775808"));
+  // Bigish numbers (representable precisely as both Int64 and double (2^53)).
+  Expect.equals(9007199254740991, int.tryParse("9007199254740991"));
+  Expect.equals(-9007199254740991, int.tryParse("-9007199254740991"));
   // Allow whitespace before and after the number.
   Expect.equals(1, int.tryParse(" 1", radix: 2));
   Expect.equals(1, int.tryParse("1 ", radix: 2));
diff --git a/tests/isolate/message_test.dart b/tests/isolate/message_test.dart
index 525ea52..fb1314b 100644
--- a/tests/isolate/message_test.dart
+++ b/tests/isolate/message_test.dart
@@ -137,7 +137,6 @@
         expect(replyObject[0], same(replyObject[2][2]));
         expect(replyObject[2], same(replyObject[4][0]));
         expect(replyObject[0][0], same(replyObject[0][2]));
-        // Bigint literals are not canonicalized so do a == check.
         expect(replyObject[0][3], equals(replyObject[4][4]));
       });
 
diff --git a/tests/language/language.status b/tests/language/language.status
index a228688..6032632 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -366,6 +366,7 @@
 
 [ $mode == debug && ($hot_reload || $hot_reload_rollback) ]
 enum_duplicate_test/01: Pass, Crash # http://dartbug.com/33156
+enum_private_test/02: Pass, Crash # dartbug.com/33339
 
 [ $runtime == dart_precompiled && $minified ]
 cyclic_type_test/*: Skip # Tests below rely on Type.toString()
@@ -474,6 +475,10 @@
 
 [ $runtime == dart_precompiled || $runtime == vm ]
 arithmetic_test: CompileTimeError # Large integer literal
+async_await_test: RuntimeError # sync-async is on by default
+asyncstar_throw_in_catch_test: RuntimeError # sync-async is on by default
+await_nonfuture_test: RuntimeError # sync-async is on by default
+await_not_started_immediately_test: RuntimeError # sync-async is on by default
 bit_operations_test: CompileTimeError # Large integer literal
 deopt_inlined_function_lazy_test: CompileTimeError # Large integer literal
 guess_cid_test: CompileTimeError # Large integer literal
diff --git a/tests/language/language_kernel.status b/tests/language/language_kernel.status
index 7b7cd78..8c89d8c 100644
--- a/tests/language/language_kernel.status
+++ b/tests/language/language_kernel.status
@@ -153,7 +153,6 @@
 compile_time_constant_c_test/02: MissingCompileTimeError
 const_conditional_test/08: MissingCompileTimeError
 const_constructor_nonconst_field_test/01: MissingCompileTimeError
-const_native_factory_test/01: MissingCompileTimeError
 const_optional_args_negative_test: Fail
 const_syntax_test/05: MissingCompileTimeError
 const_syntax_test/08: MissingCompileTimeError
diff --git a/tests/language_2/arithmetic_int64_test.dart b/tests/language_2/arithmetic_int64_test.dart
new file mode 100644
index 0000000..6354af0
--- /dev/null
+++ b/tests/language_2/arithmetic_int64_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.
+// Dart test program to test arithmetic operations.
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
+
+library arithmetic_test;
+
+import "package:expect/expect.dart";
+import 'dart:math';
+
+class ArithmeticTest {
+  static runOne() {
+    // Math functions.
+    Expect.equals(1234567890123456789, int.parse("1234567890123456789"));
+    Expect.equals(-1234567890123456789, int.parse("-1234567890123456789"));
+    Expect.equals(9223372036854775807, int.parse("9223372036854775807"));
+    Expect.equals(-9223372036854775808, int.parse("-9223372036854775808"));
+  }
+
+  static testMain() {
+    runOne();
+  }
+}
+
+main() {
+  ArithmeticTest.testMain();
+}
diff --git a/tests/language_2/arithmetic_test.dart b/tests/language_2/arithmetic_test.dart
index 6ec3a6a..7784f35 100644
--- a/tests/language_2/arithmetic_test.dart
+++ b/tests/language_2/arithmetic_test.dart
@@ -403,10 +403,8 @@
 
     Expect.equals(12, int.parse("12"));
     Expect.equals(-12, int.parse("-12"));
-    Expect.equals(1234567890123456789, int.parse("1234567890123456789"));
-    Expect.equals(-1234567890123456789, int.parse("-1234567890123456789"));
-    Expect.equals(9223372036854775807, int.parse("9223372036854775807"));
-    Expect.equals(-9223372036854775808, int.parse("-9223372036854775808"));
+    Expect.equals(9007199254740991, int.parse("9007199254740991"));
+    Expect.equals(-9007199254740991, int.parse("-9007199254740991"));
     // Type checks.
     {
       int i = int.parse("12");
diff --git a/tests/language_2/constructor_call_wrong_argument_count_negative_test.dart b/tests/language_2/constructor_call_wrong_argument_count_negative_test.dart
deleted file mode 100644
index 183a640..0000000
--- a/tests/language_2/constructor_call_wrong_argument_count_negative_test.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-// Test mismatch in argument counts.
-
-class ConstructorCallWrongArgumentCountNegativeTest {
-  static void testMain() {
-    Stockhorn nh = new Stockhorn(1);
-    nh.goodCall(1, 2, 3);
-    nh = new Stockhorn();
-  }
-}
-
-class Stockhorn {
-  Stockhorn(int a) {}
-  int goodCall(int a, int b, int c) {
-    return a + b;
-  }
-}
-
-main() {
-  ConstructorCallWrongArgumentCountNegativeTest.testMain();
-}
diff --git a/tests/language_2/constructor_call_wrong_argument_count_test.dart b/tests/language_2/constructor_call_wrong_argument_count_test.dart
new file mode 100644
index 0000000..8855749
--- /dev/null
+++ b/tests/language_2/constructor_call_wrong_argument_count_test.dart
@@ -0,0 +1,12 @@
+// 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.
+
+class Stockhorn {
+  Stockhorn(int a);
+}
+
+main() {
+  new Stockhorn(1);
+  new Stockhorn(); //# 01: compile-time error
+}
diff --git a/tests/language_2/constructor_redirect1_negative_test.dart b/tests/language_2/constructor_redirect1_negative_test.dart
deleted file mode 100644
index ccd4a83..0000000
--- a/tests/language_2/constructor_redirect1_negative_test.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-// Redirection constructors must not be cyclic.
-
-class A {
-  var x;
-  A(x) : this.named(x, 0); //# none: compile-time error
-  A.named(x, int y) : this(x + y); //# 01: compile-time error
-}
-
-class ConstructorRedirect1NegativeTest {
-  static testMain() {
-    new A(10);
-  }
-}
-
-main() {
-  ConstructorRedirect1NegativeTest.testMain();
-}
diff --git a/tests/language_2/constructor_redirect2_negative_test.dart b/tests/language_2/constructor_redirect_cycle_test.dart
similarity index 62%
rename from tests/language_2/constructor_redirect2_negative_test.dart
rename to tests/language_2/constructor_redirect_cycle_test.dart
index c0d17d2..a8e6353 100644
--- a/tests/language_2/constructor_redirect2_negative_test.dart
+++ b/tests/language_2/constructor_redirect_cycle_test.dart
@@ -5,15 +5,11 @@
 
 class A {
   var x;
-  A(x) : this(0); /*@compile-error=unspecified*/
-}
-
-class ConstructorRedirect2NegativeTest {
-  static testMain() {
-    new A(10);
-  }
+  A(x)
+      : this(0) //# 01: compile-time error
+      ;
 }
 
 main() {
-  ConstructorRedirect2NegativeTest.testMain();
+  new A(10);
 }
diff --git a/tests/language_2/constructor_redirect_indirect_cycle_test.dart b/tests/language_2/constructor_redirect_indirect_cycle_test.dart
new file mode 100644
index 0000000..50c6d64
--- /dev/null
+++ b/tests/language_2/constructor_redirect_indirect_cycle_test.dart
@@ -0,0 +1,16 @@
+// 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.
+
+class A {
+  var x;
+  A(x) : this.named(x, 0);
+  A.named(x, int y)
+      // Redirecting constructors must not be cyclic.
+      : this(x + y) //# 01: compile-time error
+      ;
+}
+
+main() {
+  new A(10);
+}
diff --git a/tests/language_2/constructor_setter_negative_test.dart b/tests/language_2/constructor_setter_test.dart
similarity index 100%
rename from tests/language_2/constructor_setter_negative_test.dart
rename to tests/language_2/constructor_setter_test.dart
diff --git a/tests/language_2/deep_nesting2_negative_test.dart b/tests/language_2/deep_nesting2_negative_test.dart
deleted file mode 100644
index cd49a07..0000000
--- a/tests/language_2/deep_nesting2_negative_test.dart
+++ /dev/null
@@ -1,10012 +0,0 @@
-// 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.
-
-// Deeply nested statements must not crash compiler due to stack overflow.
-
-var x = 0;
-
-main() {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  if (x == 0) {
-  }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
-  print("survived!");
-}
diff --git a/tests/language_2/deep_nesting1_negative_test.dart b/tests/language_2/deep_nesting_expression_test.dart
similarity index 99%
rename from tests/language_2/deep_nesting1_negative_test.dart
rename to tests/language_2/deep_nesting_expression_test.dart
index e85c11c..5ab1db5 100644
--- a/tests/language_2/deep_nesting1_negative_test.dart
+++ b/tests/language_2/deep_nesting_expression_test.dart
@@ -6,6 +6,8 @@
 
 main() {
   var x =
-[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]];
+[
+[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] //# 01: ok, compile-time error
+];
   print('okay');
 }
diff --git a/tests/language_2/deep_nesting_statement_test.dart b/tests/language_2/deep_nesting_statement_test.dart
new file mode 100644
index 0000000..bb00024
--- /dev/null
+++ b/tests/language_2/deep_nesting_statement_test.dart
@@ -0,0 +1,10013 @@
+// 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.
+
+// Deeply nested statements must not crash compiler due to stack overflow.
+
+var x = 0;
+
+main() {
+  if (x == 0) {
+  if (x == 0) { //# 01: ok, compile-time error
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  if (x == 0) { //# 01: continued
+  }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} //# 01: continued
+  }
+  print("survived!");
+}
diff --git a/tests/language_2/duplicate_export_negative_test.dart b/tests/language_2/duplicate_export_collision_test.dart
similarity index 74%
rename from tests/language_2/duplicate_export_negative_test.dart
rename to tests/language_2/duplicate_export_collision_test.dart
index 4cda438..5948d9b 100644
--- a/tests/language_2/duplicate_export_negative_test.dart
+++ b/tests/language_2/duplicate_export_collision_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library duplicate_export_negative_test;
-
-import 'duplicate_import_libd.dart';
+import 'duplicate_import_libd.dart'; //# 01: compile-time error
 
 void main() {}
diff --git a/tests/language_2/duplicate_interface_negative_test.dart b/tests/language_2/duplicate_interface_implements_test.dart
similarity index 61%
rename from tests/language_2/duplicate_interface_negative_test.dart
rename to tests/language_2/duplicate_interface_implements_test.dart
index b83a8fd..e674f1e 100644
--- a/tests/language_2/duplicate_interface_negative_test.dart
+++ b/tests/language_2/duplicate_interface_implements_test.dart
@@ -1,17 +1,15 @@
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// Check fail because of cycles in super class relationship.
-
-library duplicateInterfaceNegativeTest;
 
 import "duplicate_interface_lib.dart" as alib;
 import "duplicate_interface_lib.dart" show InterfA;
 
 // Expect error since InterfA and alib.InterfA refer to the same interface.
-class Foo implements InterfA, alib.InterfA { } //# compile-time error
+class Foo implements InterfA
+    , alib.InterfA //# 01: compile-time error
+{}
 
 main() {
-  Expect.isTrue(new Foo() is InterfA);
-  Expect.isTrue(new Foo() is alib.InterfA);
+  new Foo();
 }
diff --git a/tests/language_2/factory_with_type_parameters_test.dart b/tests/language_2/factory_with_type_parameters_test.dart
new file mode 100644
index 0000000..5ebba7d
--- /dev/null
+++ b/tests/language_2/factory_with_type_parameters_test.dart
@@ -0,0 +1,31 @@
+// 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.
+
+class Foo<T> {
+  Foo._();
+
+  factory Foo
+             <X> //# 01: compile-time error
+             <X extends T> //# 02: compile-time error
+             () => new Bar<T>();
+
+  factory Foo
+             <X> //# 03: compile-time error
+             <X extends T> //# 04: compile-time error
+             .far
+                 <X> //# 05: compile-time error
+                 <X extends T> //# 06: compile-time error
+                 <X>.fip //# 07: compile-time error
+                 <X extends T>.fip //# 08: compile-time error
+                 () => new Bar<T>();
+}
+
+class Bar<T> extends Foo<T> {
+  Bar(): super._() {}
+}
+
+main() {
+  new Foo<String>();
+  new Foo<String>.far();
+}
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index 71dfbfc..3c2b597 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -17,7 +17,7 @@
 const_cast2_test/none: CompileTimeError
 const_for_in_variable_test/01: MissingCompileTimeError # Issue 25161
 constructor_call_wrong_argument_count_negative_test: Fail # Issue 11585
-constructor_type_parameter_test/00: MissingCompileTimeError
+constructor_type_parameter_test/00: MissingCompileTimeError # Issue 33110
 constructor_with_type_parameters_test/03: MissingCompileTimeError
 deep_nesting1_negative_test: CompileTimeError # Issue 25558
 deep_nesting2_negative_test: CompileTimeError # Issue 25558
@@ -1341,6 +1341,7 @@
 constructor13_test/01: MissingCompileTimeError
 constructor13_test/02: MissingCompileTimeError
 constructor_call_as_function_test: StaticWarning
+constructor_call_wrong_argument_count_test/01: MissingCompileTimeError
 constructor_duplicate_final_test/03: MissingCompileTimeError
 constructor_with_type_parameters_test/09: MissingCompileTimeError
 constructor_with_type_parameters_test/15: MissingCompileTimeError
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index 59f8197..fae79c4 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -269,10 +269,8 @@
 constructor_duplicate_final_test/02: MissingCompileTimeError
 constructor_named_arguments_test/01: MissingCompileTimeError
 constructor_named_arguments_test/none: RuntimeError
-constructor_redirect1_negative_test/01: Crash # Stack Overflow
-constructor_redirect1_negative_test/none: MissingCompileTimeError
-constructor_redirect2_negative_test: Crash # Stack Overflow
-constructor_redirect2_test/01: MissingCompileTimeError
+constructor_redirect_cycle_test/01: MissingCompileTimeError
+constructor_redirect_indirect_cycle_test/01: Crash # Stack Overflow
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
 covariance_type_parameter_test/02: Crash # NoSuchMethodError: The method 'hasSubclass' was called on null.
 covariant_override/runtime_check_test: RuntimeError
@@ -298,7 +296,6 @@
 deferred_not_loaded_check_test: RuntimeError # Test out of date. Issue 31933
 deferred_redirecting_factory_test: RuntimeError
 double_int_to_string_test: RuntimeError, OK # non JS number semantics
-duplicate_export_negative_test: Fail
 duplicate_implements_test/01: MissingCompileTimeError
 duplicate_implements_test/02: MissingCompileTimeError
 duplicate_implements_test/03: MissingCompileTimeError
@@ -569,8 +566,8 @@
 constants_test/05: MissingCompileTimeError
 constructor12_test: RuntimeError
 constructor_named_arguments_test/none: RuntimeError
-constructor_redirect1_negative_test/01: Crash # Stack Overflow
-constructor_redirect2_negative_test: Crash # Stack Overflow
+constructor_redirect_cycle_test/01: Crash # Stack Overflow
+constructor_redirect_indirect_cycle_test/01: Crash # Stack Overflow
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
 covariance_type_parameter_test/02: RuntimeError
 covariant_override/tear_off_type_test: RuntimeError
@@ -589,7 +586,6 @@
 deferred_not_loaded_check_test: RuntimeError # Test out of date. Issue 31933
 deferred_redirecting_factory_test: RuntimeError
 double_int_to_string_test: RuntimeError, OK # non JS number semantics
-duplicate_export_negative_test: Fail
 duplicate_implements_test/01: MissingCompileTimeError
 duplicate_implements_test/02: MissingCompileTimeError
 dynamic_prefix_core_test/none: CompileTimeError
@@ -844,6 +840,7 @@
 type_variable_promotion_test: RuntimeError
 
 [ $compiler == dart2js && $fasta ]
+arithmetic_int64_test: RuntimeError # WontFix: Int not precisely representable in JS
 call_method_as_cast_test/06: RuntimeError
 call_method_implicit_tear_off_implements_function_test/05: RuntimeError
 call_method_implicit_tear_off_implements_function_test/06: RuntimeError
@@ -853,9 +850,13 @@
 checked_setter2_test: RuntimeError # Issue 31128
 checked_setter_test: RuntimeError # Issue 31128
 const_dynamic_type_literal_test/03: Pass # but it shouldn't until we fix issue 17207
+constructor_redirect_cycle_test/01: Crash # Stack Overflow
+constructor_redirect_indirect_cycle_test/01: Crash # Stack Overflow
+duplicate_interface_implements_test/01: MissingCompileTimeError
 function_propagation_test: RuntimeError
 generic_test/01: MissingCompileTimeError # front end does not validate `extends`
 instantiate_tearoff_of_call_test: RuntimeError
+mint_compares_test: RuntimeError # WontFix: Int not precisely representable in JS
 mixin_type_parameter_inference_error_test/none: CompileTimeError
 mixin_type_parameter_inference_previous_mixin_test/01: CompileTimeError
 mixin_type_parameter_inference_previous_mixin_test/02: CompileTimeError
@@ -940,8 +941,8 @@
 constants_test/05: MissingCompileTimeError
 constructor12_test: RuntimeError
 constructor_named_arguments_test/none: RuntimeError
-constructor_redirect1_negative_test/01: Crash # Stack Overflow
-constructor_redirect2_negative_test: Crash # Issue 30856
+constructor_redirect_cycle_test/01: Crash # Issue 30856
+constructor_redirect_indirect_cycle_test/01: Crash # Stack Overflow
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
 covariance_type_parameter_test/02: RuntimeError
 covariant_override/tear_off_type_test: RuntimeError
@@ -967,7 +968,6 @@
 deferred_not_loaded_check_test: RuntimeError # Test out of date. Issue 31933
 deferred_redirecting_factory_test: RuntimeError
 double_int_to_string_test: RuntimeError, OK # non JS number semantics
-duplicate_export_negative_test: Fail
 duplicate_implements_test/01: MissingCompileTimeError
 duplicate_implements_test/02: MissingCompileTimeError
 dynamic_prefix_core_test/none: CompileTimeError
@@ -1455,8 +1455,8 @@
 constants_test/05: MissingCompileTimeError
 constructor12_test: RuntimeError
 constructor_named_arguments_test/none: RuntimeError
-constructor_redirect1_negative_test/01: Crash # Stack Overflow
-constructor_redirect2_negative_test: Crash # Issue 30856
+constructor_redirect_cycle_test/01: Crash # Issue 30856
+constructor_redirect_indirect_cycle_test/01: Crash # Stack Overflow
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
 covariance_type_parameter_test/02: RuntimeError
 covariant_override/tear_off_type_test: RuntimeError
@@ -1478,7 +1478,6 @@
 deferred_not_loaded_check_test: RuntimeError # Test out of date. Issue 31933
 deferred_redirecting_factory_test: RuntimeError
 double_int_to_string_test: RuntimeError, OK # non JS number semantics
-duplicate_export_negative_test: Fail
 duplicate_implements_test/01: MissingCompileTimeError
 duplicate_implements_test/02: MissingCompileTimeError
 dynamic_prefix_core_test/none: CompileTimeError
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index d534e75..b6bc7b9 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -298,9 +298,9 @@
 bad_override_test/01: MissingCompileTimeError
 bad_override_test/02: MissingCompileTimeError
 bad_override_test/03: MissingCompileTimeError
-built_in_identifier_type_annotation_test/dynamic-funarg: RuntimeError # Issue 32194
-built_in_identifier_type_annotation_test/dynamic-funret: RuntimeError # Issue 32194
-built_in_identifier_type_annotation_test/dynamic-list: RuntimeError # Issue 32194
+built_in_identifier_type_annotation_test/dynamic-funarg: RuntimeError # Issue 30450, test name contains hyphen
+built_in_identifier_type_annotation_test/dynamic-funret: RuntimeError # Issue 30450, test name contains hyphen
+built_in_identifier_type_annotation_test/dynamic-list: RuntimeError # Issue 30450, test name contains hyphen
 call_method_as_cast_test/06: RuntimeError # Kernel allows classes to subtype `Function` so DDK elides the explicit cast.
 call_method_implicit_tear_off_implements_function_test/05: RuntimeError # Kernel is missing the implicit `call` tearoff for assignment `Function`
 call_method_implicit_tear_off_implements_function_test/06: RuntimeError # Kernel is missing the implicit `call` tearoff for assignment `Function`
@@ -340,8 +340,6 @@
 const_types_test/34: MissingCompileTimeError
 const_types_test/39: MissingCompileTimeError
 constants_test/05: MissingCompileTimeError
-constructor_redirect1_negative_test/01: MissingCompileTimeError
-constructor_redirect2_negative_test: MissingCompileTimeError
 constructor_redirect_test/01: MissingCompileTimeError
 covariant_subtyping_test: RuntimeError
 cyclic_constructor_test/01: MissingCompileTimeError
@@ -359,9 +357,9 @@
 deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError
 deferred_load_library_wrong_args_test/01: CompileTimeError
 double_identical_test: RuntimeError # Negative and positive zero are distinct, but not in ddk
-duplicate_export_negative_test: Fail
 duplicate_implements_test/01: MissingCompileTimeError
 duplicate_implements_test/02: MissingCompileTimeError
+duplicate_interface_implements_test/01: MissingCompileTimeError
 dynamic_prefix_core_test/none: CompileTimeError
 emit_const_fields_test: CompileTimeError # Issue 31533
 export_ambiguous_main_test: MissingCompileTimeError
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index 92bc089..a24b3c2 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -245,8 +245,8 @@
 const_switch2_test/01: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 const_types_test/34: MissingCompileTimeError # Issue 32988
 const_types_test/39: MissingCompileTimeError # Issue 32988
-constructor_redirect1_negative_test/01: MissingCompileTimeError # Issue 30856
-constructor_redirect2_negative_test: MissingCompileTimeError # Issue 30856
+constructor_redirect_cycle_test/01: MissingCompileTimeError # Issue 30856
+constructor_redirect_indirect_cycle_test/01: MissingCompileTimeError # Issue 30856
 constructor_redirect_test/01: MissingCompileTimeError # Fasta bug: Initializer refers to this.
 cyclic_constructor_test/01: MissingCompileTimeError # Issue 30856 (cyclic constructor redirection)
 cyclic_type_variable_test/01: MissingCompileTimeError # Issue 32989 (missing cycle check in bounds)
@@ -259,7 +259,7 @@
 deferred_inheritance_constraints_test/implements: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
 deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
-duplicate_export_negative_test: Fail # Issue 12916
+duplicate_export_collision_test/01: MissingCompileTimeError # Issue 12916
 f_bounded_quantification_test/01: MissingCompileTimeError # Issue 33018
 f_bounded_quantification_test/02: MissingCompileTimeError # Issue 33018
 factory4_test/00: MissingCompileTimeError # Issue 32988
@@ -892,7 +892,7 @@
 covariant_subtyping_test: RuntimeError
 redirecting_factory_reflection_test: RuntimeError
 
-# Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
+# Enabling of dartk for sim{arm,arm64,dbc64} revealed these test failures, which
 # are to be triaged.  Isolate tests are skipped on purpose due to the usage of
 # batch mode.
 [ $compiler == dartk && $strong && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
@@ -1062,8 +1062,6 @@
 cyclic_type_test/04: Fail, OK
 cyclic_typedef_test/10: Crash # Issue 32416.
 cyclic_typedef_test/11: Crash # Issue 32416.
-deep_nesting1_negative_test: Skip # Issue 31158
-deep_nesting2_negative_test: Skip # Issue 31158
 deferred_call_empty_before_load_test: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
 deferred_load_constants_test/none: RuntimeError # KernelVM bug: Deferred loading kernel issue 30273.
 deferred_load_library_wrong_args_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 30273.
@@ -1658,7 +1656,6 @@
 const_constructor3_test/02: MissingCompileTimeError
 const_constructor3_test/04: MissingCompileTimeError
 const_init2_test/02: MissingCompileTimeError
-const_native_factory_test: MissingCompileTimeError
 const_syntax_test/08: MissingCompileTimeError
 const_syntax_test/10: MissingCompileTimeError
 const_types_test/01: MissingCompileTimeError
@@ -1673,11 +1670,10 @@
 constants_test/05: MissingCompileTimeError
 constructor13_test/01: MissingCompileTimeError
 constructor13_test/02: MissingCompileTimeError
-constructor_call_wrong_argument_count_negative_test: Fail
+constructor_call_wrong_argument_count_test/01: MissingCompileTimeError
 constructor_duplicate_final_test/01: MissingCompileTimeError
 constructor_duplicate_final_test/02: MissingCompileTimeError
 constructor_named_arguments_test/01: MissingCompileTimeError
-constructor_redirect1_negative_test/none: MissingCompileTimeError
 create_unresolved_type_test/01: MissingCompileTimeError
 cyclic_typedef_test/13: MissingCompileTimeError
 deferred_constraints_type_annotation_test/as_operation: MissingCompileTimeError
@@ -1697,7 +1693,6 @@
 duplicate_implements_test/02: MissingCompileTimeError
 duplicate_implements_test/03: MissingCompileTimeError
 duplicate_implements_test/04: MissingCompileTimeError
-duplicate_interface_negative_test: Fail
 dynamic_field_test/01: MissingCompileTimeError
 dynamic_field_test/02: MissingCompileTimeError
 dynamic_prefix_core_test/01: MissingCompileTimeError
@@ -2291,3 +2286,6 @@
 [ $compiler == dartk || $compiler == dartkp ]
 generic_function_bounds_test: RuntimeError # Issue 32076
 generic_test/01: MissingCompileTimeError
+
+[ $compiler == dartkp || $compiler == fasta ]
+duplicate_interface_implements_test/01: MissingCompileTimeError
diff --git a/tests/language_2/language_2_precompiled.status b/tests/language_2/language_2_precompiled.status
index 33d21dd..e2eb29e 100644
--- a/tests/language_2/language_2_precompiled.status
+++ b/tests/language_2/language_2_precompiled.status
@@ -258,8 +258,6 @@
 cyclic_type_variable_test/03: MissingCompileTimeError
 cyclic_type_variable_test/04: MissingCompileTimeError
 cyclic_typedef_test/13: MissingCompileTimeError
-deep_nesting1_negative_test: Skip # Issue 31158
-deep_nesting2_negative_test: Skip # Issue 31158
 default_factory2_test/01: MissingCompileTimeError
 default_factory_test/01: MissingCompileTimeError
 deferred_constraints_constants_test: SkipByDesign
@@ -284,7 +282,6 @@
 deferred_not_loaded_check_test: RuntimeError
 deferred_redirecting_factory_test: Fail, Crash # Issue 23408
 deopt_inlined_function_lazy_test: Skip # Incompatible flag: --deoptimize-alot
-duplicate_export_negative_test: Fail # Issue 6134
 dynamic_field_test/01: MissingCompileTimeError
 dynamic_field_test/02: MissingCompileTimeError
 dynamic_prefix_core_test/01: MissingCompileTimeError
diff --git a/tests/language_2/language_2_spec_parser.status b/tests/language_2/language_2_spec_parser.status
index 1504f8f..0cc7246 100644
--- a/tests/language_2/language_2_spec_parser.status
+++ b/tests/language_2/language_2_spec_parser.status
@@ -10,16 +10,7 @@
 config_import_corelib_test: Fail # Uses conditional import.
 config_import_test: Fail # Uses conditional import.
 const_native_factory_test: Skip # Uses `native`.
-constructor_call_wrong_argument_count_negative_test: Skip # Negative, not syntax.
-constructor_redirect1_negative_test/01: Skip # Negative, not syntax.
-constructor_redirect1_negative_test/none: Skip # Negative, not syntax.
-constructor_redirect2_negative_test: Skip # Negative, not syntax.
-constructor_setter_negative_test: Skip # Negative, not syntax.
-deep_nesting1_negative_test: Skip # Stack overflow.
-deep_nesting2_negative_test: Skip # Stack overflow.
 double_invalid_test: Skip # Contains illegaly formatted double.
-duplicate_export_negative_test: Skip # Negative, not syntax.
-duplicate_interface_negative_test: Skip # Negative, not syntax.
 external_test/21: Fail # Test expects `runtime error`, it is a syntax error.
 getter_declaration_negative_test: Fail # Negative, uses getter with parameter.
 inst_field_initializer1_negative_test: Skip # Negative, not syntax.
diff --git a/tests/language_2/language_2_vm.status b/tests/language_2/language_2_vm.status
index 3674357..8bcfb7a4c 100644
--- a/tests/language_2/language_2_vm.status
+++ b/tests/language_2/language_2_vm.status
@@ -21,7 +21,7 @@
 large_class_declaration_test: SkipSlow # Uses too much memory.
 
 [ $arch == ia32 && $mode == release && $runtime == vm ]
-deep_nesting1_negative_test: Crash, Pass # Issue 31496
+deep_nesting_expression_test/01: Crash, Pass # Issue 31496
 
 [ !$strong && ($runtime == dart_precompiled || $runtime == vm) ]
 *: SkipByDesign # tests/language has the non-strong mode versions of these tests.
diff --git a/tests/language_2/regress_33392_test.dart b/tests/language_2/regress_33392_test.dart
new file mode 100644
index 0000000..18e2b73
--- /dev/null
+++ b/tests/language_2/regress_33392_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'package:expect/expect.dart';
+
+class B extends A<B> {}
+
+class A<T> {
+  int x(FutureOr<T> v) => 42;
+}
+
+void main() {
+  Expect.equals(new B().x(new B()), 42);
+}
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 116c44e..fc51aee 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -367,6 +367,7 @@
 convert/utf85_test: Skip # Pass, Slow Issue 12644.
 
 [ $compiler == app_jit || $compiler == none || $compiler == precompiler ]
+async/async_await_sync_completer_test: RuntimeError # sync-async is on by default.
 async/timer_not_available_test: SkipByDesign # only meant to test when there is no way to implement timer (currently only in d8)
 async/timer_regress22626_test: Pass, RuntimeError # Issue 28254
 mirrors/mirrors_used*: SkipByDesign # Invalid tests. MirrorsUsed does not have a specification, and dart:mirrors is not required to hide declarations that are not covered by any MirrorsUsed annotation.
diff --git a/tests/lib_2/isolate/message_test.dart b/tests/lib_2/isolate/message_test.dart
index 525ea52..fb1314b 100644
--- a/tests/lib_2/isolate/message_test.dart
+++ b/tests/lib_2/isolate/message_test.dart
@@ -137,7 +137,6 @@
         expect(replyObject[0], same(replyObject[2][2]));
         expect(replyObject[2], same(replyObject[4][0]));
         expect(replyObject[0][0], same(replyObject[0][2]));
-        // Bigint literals are not canonicalized so do a == check.
         expect(replyObject[0][3], equals(replyObject[4][4]));
       });
 
diff --git a/tests/lib_2/isolate/native_wrapper_message_test.dart b/tests/lib_2/isolate/native_wrapper_message_test.dart
new file mode 100644
index 0000000..09dcb40
--- /dev/null
+++ b/tests/lib_2/isolate/native_wrapper_message_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:isolate';
+import 'dart:nativewrappers';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+
+echo(msg) {
+  var data = msg[0];
+  var reply = msg[1];
+  reply.send('echoing ${data(1)}}');
+}
+
+class Test extends NativeFieldWrapperClass2 {
+  Test(this.i, this.j);
+  int i, j;
+}
+
+main() {
+  var port = new RawReceivePort();
+  var obj = new Test(1, 2);
+  var msg = [obj, port.sendPort];
+  var snd = Isolate.spawn(echo, msg);
+
+  asyncStart();
+  snd.catchError((e) {
+    Expect.isTrue(e is ArgumentError);
+    Expect.isTrue("$e".contains("NativeWrapper"));
+    port.close();
+    asyncEnd();
+  });
+}
diff --git a/tests/lib_2/lib_2_dartdevc.status b/tests/lib_2/lib_2_dartdevc.status
index 9cdf0ea..bbfa3a4 100644
--- a/tests/lib_2/lib_2_dartdevc.status
+++ b/tests/lib_2/lib_2_dartdevc.status
@@ -4,6 +4,7 @@
 
 [ $compiler == dartdevc ]
 html/element_types_keygen_test: CompileTimeError # Chrome 57 keygen removed
+html/mediasource_test: RuntimeError # Issue 29922
 html/xhr_test: Pass, Slow
 
 [ $compiler == dartdevk ]
@@ -31,6 +32,7 @@
 html/client_rect_test: Pass, RuntimeError # Issue 31019
 html/css_test: Pass, RuntimeError # Issue 31019
 html/fileapi_entry_test: Pass, RuntimeError # Issue 31019
+html/interactive_media_test: Skip # Requires interactive camera, microphone permissions.
 
 [ $system == windows && ($compiler == dartdevc || $compiler == dartdevk) ]
 html/xhr_test: Skip # Times out. Issue 21527
@@ -79,7 +81,6 @@
 html/custom_elements_23127_test: Skip # Issue 29922
 html/custom_elements_test: Skip # Issue 29922
 html/deferred_multi_app_htmltest: Skip # Issue 29919
-html/element_classes_svg_test: RuntimeError # Issue 29922
 html/element_classes_test: RuntimeError # Issue 29922
 html/fontface_loaded_test: RuntimeError
 html/isolates_test: RuntimeError # Issue 29922
@@ -89,7 +90,6 @@
 html/js_typed_interop_type_test: RuntimeError # Issue 30947
 html/js_util_test: RuntimeError # Issue 29922
 html/media_stream_test: RuntimeError # Issue 29922
-html/mediasource_test: RuntimeError # Issue 29922
 html/no_linked_scripts_htmltest: Skip # Issue 29919
 html/notification_permission_test: Timeout # Issue 32002
 html/scripts_htmltest: Skip # Issue 29919
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index ffc9c90..bef13c5 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -51,7 +51,6 @@
 
 [ $arch == x64 && $compiler == dartk && $mode == debug && $runtime == vm && $strong ]
 mirrors/invocation_fuzz_test: Skip # Because it times out, issue 29439.
-mirrors/variable_is_const_test/01: Crash
 
 [ $builder_tag == optimization_counter_threshold && $compiler == dartk ]
 isolate/unresolved_ports_test: CompileTimeError, Pass, Timeout # Fails to compile on opt counter builder (#31838)
@@ -63,7 +62,9 @@
 
 [ $compiler == app_jitk && $mode == product ]
 isolate/spawn_function_custom_class_test: Skip # Timeout
-isolate/spawn_uri_nested_vm_test: Skip # Timeout
+
+[ $compiler == app_jitk && ($mode == product || $mode == release) ]
+isolate/spawn_uri_nested_vm_test: Skip # Timeout, Issue 33385
 
 [ $compiler != dart2js && $fasta && !$strong ]
 isolate/browser/compute_this_script_browser_test: CompileTimeError
@@ -72,21 +73,13 @@
 isolate/browser/package_resolve_browser_test: CompileTimeError
 
 [ $compiler == dartk && $mode == debug && $runtime == vm && $strong ]
-mirrors/other_declarations_location_test: Crash # assertion error, TypeParameter not having position.
+mirrors/other_declarations_location_test: Crash # Issue 33325 (assertion error, TypeParameter not having position).
 
 [ $compiler == dartk && $mode == debug && $hot_reload_rollback ]
 isolate/message3_test/constList_identical: Skip # Timeout
 
 [ $compiler == dartk && $mode == debug && $strong ]
-mirrors/instance_members_unimplemented_interface_test: Crash
-mirrors/library_import_deferred_loading_test: Crash # Deferred loading kernel issue 28335.
-mirrors/load_library_test: Crash
-
-# Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
-# are to be triaged.  Isolate tests are skipped on purpose due to the usage of
-# batch mode.
-[ $compiler == dartk && $mode == debug && $strong && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
-mirrors/variable_is_const_test/01: Crash # Please triage.
+mirrors/variable_is_const_test/01: Crash # Issue 32326
 
 [ $compiler == dartk && $runtime == vm && $checked && $strong ]
 mirrors/redirecting_factory_different_type_test/01: MissingCompileTimeError # Issue 28424
@@ -117,11 +110,10 @@
 mirrors/class_mirror_location_test: RuntimeError
 mirrors/constructor_kinds_test/01: RuntimeError
 mirrors/constructor_kinds_test/none: RuntimeError
-mirrors/constructor_private_name_test: RuntimeError
+mirrors/constructor_private_name_test: RuntimeError # Issue 33345 - Incorrect qualified symbol literal from kernel reader
 mirrors/constructors_test: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/dart2js_mirrors_test: RuntimeError # 31916
 mirrors/deferred_mirrors_metadata_test: RuntimeError, CompileTimeError # Deferred loading kernel issue 28335.
-mirrors/deferred_mirrors_test: Crash # 31916
 mirrors/deferred_type_test: CompileTimeError, RuntimeError
 mirrors/empty_test: Crash, RuntimeError
 mirrors/enum_test: RuntimeError # Issue 31402 (Invocation arguments)
@@ -133,11 +125,7 @@
 mirrors/generic_function_typedef_test: RuntimeError
 mirrors/generic_interface_test/01: RuntimeError
 mirrors/generic_mixin_applications_test: RuntimeError
-mirrors/hot_get_field_test: RuntimeError
-mirrors/hot_set_field_test: RuntimeError
 mirrors/invocation_fuzz_test: RuntimeError, Crash
-mirrors/invoke_private_test: RuntimeError
-mirrors/invoke_private_wrong_library_test: RuntimeError
 mirrors/library_declarations_test/none: RuntimeError # Issue 31402 (Invocation arguments)
 mirrors/library_enumeration_deferred_loading_test: RuntimeError
 mirrors/library_exports_hidden_test: RuntimeError # Issue 33098
@@ -169,14 +157,12 @@
 mirrors/mixin_members_test: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/native_class_test: SkipByDesign # Imports dart:html
 mirrors/operator_test: CompileTimeError # Issue 31402 (Invocation arguments)
-mirrors/other_declarations_location_test: RuntimeError
+mirrors/other_declarations_location_test: RuntimeError # Issue 33325 (no source positions for type parameters).
 mirrors/parameter_annotation_mirror_test: RuntimeError
 mirrors/parameter_metadata_test: RuntimeError
 mirrors/parameter_of_mixin_app_constructor_test: RuntimeError # Issue 31402 (Invocation arguments)
-mirrors/private_class_field_test: RuntimeError
-mirrors/private_field_test: RuntimeError
-mirrors/private_symbol_test: RuntimeError
-mirrors/private_types_test: RuntimeError
+mirrors/private_symbol_test: RuntimeError # Issue 33326 - CFE/kernel invalid typedef substitution
+mirrors/private_types_test: RuntimeError # Issue 33326 - CFE/kernel invalid typedef substitution
 mirrors/redirecting_factory_different_type_test/01: MissingCompileTimeError
 mirrors/redirecting_factory_test/01: RuntimeError
 mirrors/redirecting_factory_test/02: RuntimeError
@@ -215,7 +201,7 @@
 async/stream_state_nonzero_timer_test: Crash
 async/stream_subscription_as_future_test: Crash
 async/stream_subscription_cancel_test: Crash
-isolate/message4_test: Crash
+isolate/message4_test: Pass, Timeout
 isolate/spawn_uri_multi_test/01: Crash
 isolate/spawn_uri_multi_test/none: Crash
 
@@ -243,7 +229,6 @@
 mirrors/fake_function_with_call_test: RuntimeError
 mirrors/instance_members_easier_test: RuntimeError
 mirrors/instance_members_test: RuntimeError
-mirrors/instance_members_unimplemented_interface_test: RuntimeError
 mirrors/instance_members_with_override_test: RuntimeError
 mirrors/invoke_closurization2_test: RuntimeError
 mirrors/invoke_throws_test: RuntimeError
diff --git a/tests/lib_2/lib_2_vm.status b/tests/lib_2/lib_2_vm.status
index 16463be..6b5454d 100644
--- a/tests/lib_2/lib_2_vm.status
+++ b/tests/lib_2/lib_2_vm.status
@@ -2,6 +2,9 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
+[ $runtime != vm ]
+isolate/native_wrapper_message_test: Skip # A VM specific test.
+
 [ $arch == arm64 && $runtime == vm ]
 mirrors/immutable_collections_test: Pass, Slow # http://dartbug.com/33057
 
diff --git a/tests/lib_2/mirrors/dynamic_load_test.dart b/tests/lib_2/mirrors/dynamic_load_test.dart
index 2cc7c3a..2605b8b 100644
--- a/tests/lib_2/mirrors/dynamic_load_test.dart
+++ b/tests/lib_2/mirrors/dynamic_load_test.dart
@@ -43,7 +43,8 @@
   }
   print(error);
   Expect.isTrue(error.toString().contains("Cannot open file") ||
-      error.toString().contains("No such file or directory"));
+      error.toString().contains("No such file or directory") ||
+      error.toString().contains("The system cannot find the file specified"));
   Expect.isTrue(error.toString().contains("DOES_NOT_EXIST"));
 
   Future<LibraryMirror> bad_load2 = isolate.loadUri(Uri.parse("dart:_builtin"));
diff --git a/tests/lib_2/mirrors/instance_members_unimplemented_interface_test.dart b/tests/lib_2/mirrors/instance_members_unimplemented_interface_test.dart
index 6d2a4dd..5c26410 100644
--- a/tests/lib_2/mirrors/instance_members_unimplemented_interface_test.dart
+++ b/tests/lib_2/mirrors/instance_members_unimplemented_interface_test.dart
@@ -13,7 +13,7 @@
 
 abstract class C implements I {}
 
-selectKeys(map, predicate) {
+selectKeys<K, V>(Map<K, V> map, bool predicate(V)) {
   return map.keys.where((key) => predicate(map[key]));
 }
 
diff --git a/tests/lib_2/mirrors/regress_33259_test.dart b/tests/lib_2/mirrors/regress_33259_test.dart
new file mode 100644
index 0000000..5244a33
--- /dev/null
+++ b/tests/lib_2/mirrors/regress_33259_test.dart
@@ -0,0 +1,26 @@
+// 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.
+
+// Regression test for http://dartbug.com/33259.
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+
+void main() {
+  Expect.isTrue(
+      reflectClass(Thing).declarations[#foo].metadata[0].reflectee is Sub);
+}
+
+class Thing {
+  @Sub()
+  String foo;
+}
+
+class Base<T> {
+  const Base();
+}
+
+class Sub extends Base<String> {
+  const Sub();
+}
diff --git a/tests/standalone/io/raw_secure_server_socket_test.dart b/tests/standalone/io/raw_secure_server_socket_test.dart
index a2a1d05..0273c5d 100644
--- a/tests/standalone/io/raw_secure_server_socket_test.dart
+++ b/tests/standalone/io/raw_secure_server_socket_test.dart
@@ -277,7 +277,7 @@
             client.writeEventsEnabled = true;
           }
           if (bytesWritten == data.length) {
-            client.shutdown(SocketDirection.SEND);
+            client.shutdown(SocketDirection.send);
           }
           break;
         case RawSocketEvent.readClosed:
diff --git a/tests/standalone_2/http_launch_test.dart b/tests/standalone_2/http_launch_test.dart
index 657ca58..a8852fd 100644
--- a/tests/standalone_2/http_launch_test.dart
+++ b/tests/standalone_2/http_launch_test.dart
@@ -27,7 +27,7 @@
 int port;
 
 _sendNotFound(HttpResponse response) {
-  response.statusCode = HttpStatus.NOT_FOUND;
+  response.statusCode = HttpStatus.notFound;
   response.close();
 }
 
@@ -94,5 +94,5 @@
 }
 
 main() {
-  HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, 0).then(serverRunning);
+  HttpServer.bind(InternetAddress.loopbackIPv4, 0).then(serverRunning);
 }
diff --git a/tests/standalone_2/io/addlatexhash_test.dart b/tests/standalone_2/io/addlatexhash_test.dart
index d586a35..6465852 100755
--- a/tests/standalone_2/io/addlatexhash_test.dart
+++ b/tests/standalone_2/io/addlatexhash_test.dart
@@ -185,7 +185,7 @@
   var renewLMHashCmd = r"\renewcommand{\LMHash}[1]{\OriginalLMHash{xxxx}}";
   new File(styPath)
       .copySync(tmpStyPath)
-      .writeAsStringSync(renewLMHashCmd, mode: FileMode.APPEND);
+      .writeAsStringSync(renewLMHashCmd, mode: FileMode.append);
   new File(specPath).copySync(tmpSpecPath);
 
   checkAction(runAddHash(), "addlatexhash.dart failed");
diff --git a/tests/standalone_2/io/http_advanced_test.dart b/tests/standalone_2/io/http_advanced_test.dart
index b790584..de25c16 100644
--- a/tests/standalone_2/io/http_advanced_test.dart
+++ b/tests/standalone_2/io/http_advanced_test.dart
@@ -106,7 +106,7 @@
   // Return a 404.
   void _notFoundHandler(HttpRequest request) {
     var response = request.response;
-    response.statusCode = HttpStatus.NOT_FOUND;
+    response.statusCode = HttpStatus.notFound;
     response.headers.set("Content-Type", "text/html; charset=UTF-8");
     response.write("Page not found");
     response.close();
@@ -119,7 +119,7 @@
     Expect.equals("www.dartlang.org:1234", request.headers["Host"][0]);
     Expect.equals("www.dartlang.org", request.headers.host);
     Expect.equals(1234, request.headers.port);
-    response.statusCode = HttpStatus.OK;
+    response.statusCode = HttpStatus.ok;
     response.close();
   }
 
@@ -161,7 +161,7 @@
     Expect.equals("utf-8", request.headers.contentType.parameters["charset"]);
 
     response.headers
-        .set(HttpHeaders.CONTENT_TYPE, "text/html;  charset = utf-8");
+        .set(HttpHeaders.contentTypeHeader, "text/html;  charset = utf-8");
     response.close();
   }
 
@@ -260,21 +260,21 @@
       request.headers.port = 1234;
       Expect.equals("www.dartlang.com:1234", request.headers["host"][0]);
       Expect.equals(1234, request.headers.port);
-      request.headers.port = HttpClient.DEFAULT_HTTP_PORT;
-      Expect.equals(HttpClient.DEFAULT_HTTP_PORT, request.headers.port);
+      request.headers.port = HttpClient.defaultHttpPort;
+      Expect.equals(HttpClient.defaultHttpPort, request.headers.port);
       Expect.equals("www.dartlang.com", request.headers["host"][0]);
       request.headers.set("Host", "www.dartlang.org");
       Expect.equals("www.dartlang.org", request.headers.host);
-      Expect.equals(HttpClient.DEFAULT_HTTP_PORT, request.headers.port);
+      Expect.equals(HttpClient.defaultHttpPort, request.headers.port);
       request.headers.set("Host", "www.dartlang.org:");
       Expect.equals("www.dartlang.org", request.headers.host);
-      Expect.equals(HttpClient.DEFAULT_HTTP_PORT, request.headers.port);
+      Expect.equals(HttpClient.defaultHttpPort, request.headers.port);
       request.headers.set("Host", "www.dartlang.org:1234");
       Expect.equals("www.dartlang.org", request.headers.host);
       Expect.equals(1234, request.headers.port);
       return request.close();
     }).then((response) {
-      Expect.equals(HttpStatus.OK, response.statusCode);
+      Expect.equals(HttpStatus.ok, response.statusCode);
       response.listen((_) {}, onDone: () {
         httpClient.close();
         server.shutdown();
@@ -294,7 +294,7 @@
     HttpClient httpClient = new HttpClient();
 
     void processResponse(HttpClientResponse response) {
-      Expect.equals(HttpStatus.OK, response.statusCode);
+      Expect.equals(HttpStatus.ok, response.statusCode);
       Expect.equals(
           "Fri, 11 Jun 1999 18:46:53 GMT", response.headers["expires"][0]);
       Expect.equals(new DateTime.utc(1999, DateTime.june, 11, 18, 46, 53, 0),
@@ -330,7 +330,7 @@
     HttpClient httpClient = new HttpClient();
 
     void processResponse(HttpClientResponse response) {
-      Expect.equals(HttpStatus.OK, response.statusCode);
+      Expect.equals(HttpStatus.ok, response.statusCode);
       Expect.equals(
           "text/html; charset=utf-8", response.headers.contentType.toString());
       Expect.equals("text/html", response.headers.contentType.value);
@@ -356,7 +356,7 @@
 
     httpClient.get("127.0.0.1", port, "/contenttype2").then((request) {
       request.headers
-          .set(HttpHeaders.CONTENT_TYPE, "text/html;  charset = utf-8");
+          .set(HttpHeaders.contentTypeHeader, "text/html;  charset = utf-8");
       return request.close();
     }).then(processResponse);
   });
diff --git a/tests/standalone_2/io/http_auth_digest_test.dart b/tests/standalone_2/io/http_auth_digest_test.dart
index efe18a2..3b4418c 100644
--- a/tests/standalone_2/io/http_auth_digest_test.dart
+++ b/tests/standalone_2/io/http_auth_digest_test.dart
@@ -38,7 +38,7 @@
       server = s;
       server.listen((HttpRequest request) {
         sendUnauthorizedResponse(HttpResponse response, {stale: false}) {
-          response.statusCode = HttpStatus.UNAUTHORIZED;
+          response.statusCode = HttpStatus.unauthorized;
           StringBuffer authHeader = new StringBuffer();
           authHeader.write('Digest');
           authHeader.write(', realm="$realm"');
@@ -49,14 +49,16 @@
           }
           authHeader.write(', domain="/digest/"');
           if (serverQop != null) authHeader.write(', qop="$serverQop"');
-          response.headers.set(HttpHeaders.WWW_AUTHENTICATE, authHeader);
+          response.headers.set(HttpHeaders.wwwAuthenticateHeader, authHeader);
           unauthCount++;
         }
 
         var response = request.response;
-        if (request.headers[HttpHeaders.AUTHORIZATION] != null) {
-          Expect.equals(1, request.headers[HttpHeaders.AUTHORIZATION].length);
-          String authorization = request.headers[HttpHeaders.AUTHORIZATION][0];
+        if (request.headers[HttpHeaders.authorizationHeader] != null) {
+          Expect.equals(
+              1, request.headers[HttpHeaders.authorizationHeader].length);
+          String authorization =
+              request.headers[HttpHeaders.authorizationHeader][0];
           HeaderValue header =
               HeaderValue.parse(authorization, parameterSeparator: ",");
           if (header.value.toLowerCase() == "basic") {
@@ -152,7 +154,7 @@
           .getUrl(url)
           .then((HttpClientRequest request) => request.close())
           .then((HttpClientResponse response) {
-        Expect.equals(HttpStatus.UNAUTHORIZED, response.statusCode);
+        Expect.equals(HttpStatus.unauthorized, response.statusCode);
         return response.fold(null, (x, y) {});
       });
     }
@@ -178,7 +180,7 @@
           .getUrl(url)
           .then((HttpClientRequest request) => request.close())
           .then((HttpClientResponse response) {
-        Expect.equals(HttpStatus.OK, response.statusCode);
+        Expect.equals(HttpStatus.ok, response.statusCode);
         Expect.equals(1, response.headers["Authentication-Info"].length);
         return response.fold(null, (x, y) {});
       });
@@ -224,7 +226,7 @@
           .getUrl(url)
           .then((HttpClientRequest request) => request.close())
           .then((HttpClientResponse response) {
-        Expect.equals(HttpStatus.OK, response.statusCode);
+        Expect.equals(HttpStatus.ok, response.statusCode);
         Expect.equals(1, response.headers["Authentication-Info"].length);
         return response.fold(null, (x, y) {});
       });
@@ -251,7 +253,7 @@
           .getUrl(url)
           .then((HttpClientRequest request) => request.close())
           .then((HttpClientResponse response) {
-        Expect.equals(HttpStatus.OK, response.statusCode);
+        Expect.equals(HttpStatus.ok, response.statusCode);
         Expect.equals(1, response.headers["Authentication-Info"].length);
         return response.fold(null, (x, y) {});
       });
@@ -285,7 +287,7 @@
           .getUrl(url)
           .then((HttpClientRequest request) => request.close())
           .then((HttpClientResponse response) {
-        Expect.equals(HttpStatus.OK, response.statusCode);
+        Expect.equals(HttpStatus.ok, response.statusCode);
         Expect.equals(1, response.headers["Authentication-Info"].length);
         return response.fold(null, (x, y) {});
       });
@@ -339,7 +341,7 @@
         .then((HttpClientResponse response) {
       count++;
       if (count % 100 == 0) print(count);
-      Expect.equals(HttpStatus.OK, response.statusCode);
+      Expect.equals(HttpStatus.ok, response.statusCode);
       return response.fold(null, (x, y) {});
     });
   }
diff --git a/tests/standalone_2/io/http_auth_test.dart b/tests/standalone_2/io/http_auth_test.dart
index 8a3fc36..9ab8161 100644
--- a/tests/standalone_2/io/http_auth_test.dart
+++ b/tests/standalone_2/io/http_auth_test.dart
@@ -36,23 +36,25 @@
           password = request.uri.path.substring(1, 6);
         }
         if (passwordChanged) password = "${password}1";
-        if (request.headers[HttpHeaders.AUTHORIZATION] != null) {
-          Expect.equals(1, request.headers[HttpHeaders.AUTHORIZATION].length);
-          String authorization = request.headers[HttpHeaders.AUTHORIZATION][0];
+        if (request.headers[HttpHeaders.authorizationHeader] != null) {
+          Expect.equals(
+              1, request.headers[HttpHeaders.authorizationHeader].length);
+          String authorization =
+              request.headers[HttpHeaders.authorizationHeader][0];
           List<String> tokens = authorization.split(" ");
           Expect.equals("Basic", tokens[0]);
           String auth = base64.encode(utf8.encode("$username:$password"));
           if (passwordChanged && auth != tokens[1]) {
-            response.statusCode = HttpStatus.UNAUTHORIZED;
+            response.statusCode = HttpStatus.unauthorized;
             response.headers
-                .set(HttpHeaders.WWW_AUTHENTICATE, "Basic, realm=realm");
+                .set(HttpHeaders.wwwAuthenticateHeader, "Basic, realm=realm");
           } else {
             Expect.equals(auth, tokens[1]);
           }
         } else {
-          response.statusCode = HttpStatus.UNAUTHORIZED;
+          response.statusCode = HttpStatus.unauthorized;
           response.headers
-              .set(HttpHeaders.WWW_AUTHENTICATE, "Basic, realm=realm");
+              .set(HttpHeaders.wwwAuthenticateHeader, "Basic, realm=realm");
         }
         response.close();
       });
@@ -97,7 +99,7 @@
           .getUrl(url)
           .then((HttpClientRequest request) => request.close())
           .then((HttpClientResponse response) {
-        Expect.equals(HttpStatus.UNAUTHORIZED, response.statusCode);
+        Expect.equals(HttpStatus.unauthorized, response.statusCode);
         return response.fold(null, (x, y) {});
       });
     }
@@ -125,7 +127,7 @@
           .getUrl(url)
           .then((HttpClientRequest request) => request.close())
           .then((HttpClientResponse response) {
-        Expect.equals(HttpStatus.OK, response.statusCode);
+        Expect.equals(HttpStatus.ok, response.statusCode);
         return response.fold(null, (x, y) {});
       });
     }
@@ -174,7 +176,7 @@
           .getUrl(url)
           .then((HttpClientRequest request) => request.close())
           .then((HttpClientResponse response) {
-        Expect.equals(HttpStatus.OK, response.statusCode);
+        Expect.equals(HttpStatus.ok, response.statusCode);
         return response.fold(null, (x, y) {});
       });
     }
@@ -216,7 +218,7 @@
       .getUrl(Uri.parse("http://127.0.0.1/basic/test"))
       .then((HttpClientRequest request) => request.close())
       .then((HttpClientResponse response) {
-    Expect.equals(HttpStatus.OK, response.statusCode);
+    Expect.equals(HttpStatus.ok, response.statusCode);
     response.fold(null, (x, y) {}).then((_) {
       client.close();
     });
@@ -237,7 +239,7 @@
       .getUrl(Uri.parse("http://127.0.0.1/digest/test"))
       .then((HttpClientRequest request) => request.close())
       .then((HttpClientResponse response) {
-    Expect.equals(HttpStatus.OK, response.statusCode);
+    Expect.equals(HttpStatus.ok, response.statusCode);
     response.fold(null, (x, y) {}).then((_) {
       client.close();
     });
diff --git a/tests/standalone_2/io/http_basic_test.dart b/tests/standalone_2/io/http_basic_test.dart
index ead3aef..573e005 100644
--- a/tests/standalone_2/io/http_basic_test.dart
+++ b/tests/standalone_2/io/http_basic_test.dart
@@ -120,7 +120,7 @@
   // Return a 404.
   void _notFoundHandler(HttpRequest request) {
     var response = request.response;
-    response.statusCode = HttpStatus.NOT_FOUND;
+    response.statusCode = HttpStatus.notFound;
     response.headers.set("Content-Type", "text/html; charset=UTF-8");
     response.write("Page not found");
     response.close();
@@ -129,7 +129,7 @@
   // Return a 301 with a custom reason phrase.
   void _reasonForMovingHandler(HttpRequest request) {
     var response = request.response;
-    response.statusCode = HttpStatus.MOVED_PERMANENTLY;
+    response.statusCode = HttpStatus.movedPermanently;
     response.reasonPhrase = "Don't come looking here any more";
     response.close();
   }
@@ -141,7 +141,7 @@
     Expect.equals("www.dartlang.org:1234", request.headers["Host"][0]);
     Expect.equals("www.dartlang.org", request.headers.host);
     Expect.equals(1234, request.headers.port);
-    response.statusCode = HttpStatus.OK;
+    response.statusCode = HttpStatus.ok;
     response.close();
   }
 
@@ -211,7 +211,7 @@
         .get("127.0.0.1", port, "/0123456789")
         .then((request) => request.close())
         .then((response) {
-      Expect.equals(HttpStatus.OK, response.statusCode);
+      Expect.equals(HttpStatus.ok, response.statusCode);
       StringBuffer body = new StringBuffer();
       response.listen((data) => body.write(new String.fromCharCodes(data)),
           onDone: () {
@@ -244,7 +244,7 @@
         }
         return request.close();
       }).then((response) {
-        Expect.equals(HttpStatus.OK, response.statusCode);
+        Expect.equals(HttpStatus.ok, response.statusCode);
         StringBuffer body = new StringBuffer();
         response.listen((data) => body.write(new String.fromCharCodes(data)),
             onDone: () {
@@ -275,7 +275,7 @@
         .get("127.0.0.1", port, "/thisisnotfound")
         .then((request) => request.close())
         .then((response) {
-      Expect.equals(HttpStatus.NOT_FOUND, response.statusCode);
+      Expect.equals(HttpStatus.notFound, response.statusCode);
       var body = new StringBuffer();
       response.listen((data) => body.write(new String.fromCharCodes(data)),
           onDone: () {
@@ -296,7 +296,7 @@
       request.followRedirects = false;
       return request.close();
     }).then((response) {
-      Expect.equals(HttpStatus.MOVED_PERMANENTLY, response.statusCode);
+      Expect.equals(HttpStatus.movedPermanently, response.statusCode);
       Expect.equals("Don't come looking here any more", response.reasonPhrase);
       response.listen((data) => Expect.fail("No data expected"), onDone: () {
         httpClient.close();
diff --git a/tests/standalone_2/io/http_compression_test.dart b/tests/standalone_2/io/http_compression_test.dart
index 651d5fa..35afe5a 100644
--- a/tests/standalone_2/io/http_compression_test.dart
+++ b/tests/standalone_2/io/http_compression_test.dart
@@ -22,11 +22,11 @@
       var client = new HttpClient();
       client.autoUncompress = clientAutoUncompress;
       client.get("127.0.0.1", server.port, "/").then((request) {
-        request.headers.set(HttpHeaders.ACCEPT_ENCODING, "gzip,deflate");
+        request.headers.set(HttpHeaders.acceptEncodingHeader, "gzip,deflate");
         return request.close();
       }).then((response) {
         Expect.equals(
-            "gzip", response.headers.value(HttpHeaders.CONTENT_ENCODING));
+            "gzip", response.headers.value(HttpHeaders.contentEncodingHeader));
         response.fold([], (list, b) {
           list.addAll(b);
           return list;
@@ -34,7 +34,7 @@
           if (clientAutoUncompress) {
             Expect.listEquals(data, list);
           } else {
-            Expect.listEquals(data, GZIP.decode(list));
+            Expect.listEquals(data, gzip.decode(list));
           }
           server.close();
           client.close();
@@ -61,11 +61,13 @@
       });
       var client = new HttpClient();
       client.get("127.0.0.1", server.port, "/").then((request) {
-        request.headers.set(HttpHeaders.ACCEPT_ENCODING, encoding);
+        request.headers.set(HttpHeaders.acceptEncodingHeader, encoding);
         return request.close();
       }).then((response) {
-        Expect.equals(valid,
-            ("gzip" == response.headers.value(HttpHeaders.CONTENT_ENCODING)));
+        Expect.equals(
+            valid,
+            ("gzip" ==
+                response.headers.value(HttpHeaders.contentEncodingHeader)));
         response.listen((_) {}, onDone: () {
           server.close();
           client.close();
@@ -92,7 +94,8 @@
   HttpServer.bind("127.0.0.1", 0).then((server) {
     Expect.equals(false, server.autoCompress);
     server.listen((request) {
-      Expect.equals('gzip', request.headers.value(HttpHeaders.ACCEPT_ENCODING));
+      Expect.equals(
+          'gzip', request.headers.value(HttpHeaders.acceptEncodingHeader));
       request.response.write("data");
       request.response.close();
     });
@@ -101,7 +104,8 @@
         .get("127.0.0.1", server.port, "/")
         .then((request) => request.close())
         .then((response) {
-      Expect.equals(null, response.headers.value(HttpHeaders.CONTENT_ENCODING));
+      Expect.equals(
+          null, response.headers.value(HttpHeaders.contentEncodingHeader));
       response.listen((_) {}, onDone: () {
         server.close();
         client.close();
diff --git a/tests/standalone_2/io/http_connection_header_test.dart b/tests/standalone_2/io/http_connection_header_test.dart
index cb2c23d..a42e458 100644
--- a/tests/standalone_2/io/http_connection_header_test.dart
+++ b/tests/standalone_2/io/http_connection_header_test.dart
@@ -8,9 +8,9 @@
 import "dart:io";
 
 void setConnectionHeaders(HttpHeaders headers) {
-  headers.add(HttpHeaders.CONNECTION, "my-connection-header1");
+  headers.add(HttpHeaders.connectionHeader, "my-connection-header1");
   headers.add("My-Connection-Header1", "some-value1");
-  headers.add(HttpHeaders.CONNECTION, "my-connection-header2");
+  headers.add(HttpHeaders.connectionHeader, "my-connection-header2");
   headers.add("My-Connection-Header2", "some-value2");
 }
 
@@ -18,15 +18,15 @@
     HttpHeaders headers, bool persistentConnection) {
   Expect.equals("some-value1", headers.value("My-Connection-Header1"));
   Expect.equals("some-value2", headers.value("My-Connection-Header2"));
-  Expect.isTrue(headers[HttpHeaders.CONNECTION]
+  Expect.isTrue(headers[HttpHeaders.connectionHeader]
       .any((value) => value.toLowerCase() == "my-connection-header1"));
-  Expect.isTrue(headers[HttpHeaders.CONNECTION]
+  Expect.isTrue(headers[HttpHeaders.connectionHeader]
       .any((value) => value.toLowerCase() == "my-connection-header2"));
   if (persistentConnection) {
-    Expect.equals(2, headers[HttpHeaders.CONNECTION].length);
+    Expect.equals(2, headers[HttpHeaders.connectionHeader].length);
   } else {
-    Expect.equals(3, headers[HttpHeaders.CONNECTION].length);
-    Expect.isTrue(headers[HttpHeaders.CONNECTION]
+    Expect.equals(3, headers[HttpHeaders.connectionHeader].length);
+    Expect.isTrue(headers[HttpHeaders.connectionHeader]
         .any((value) => value.toLowerCase() == "close"));
   }
 }
diff --git a/tests/standalone_2/io/http_content_length_test.dart b/tests/standalone_2/io/http_content_length_test.dart
index dcb6724..6f67664 100644
--- a/tests/standalone_2/io/http_content_length_test.dart
+++ b/tests/standalone_2/io/http_content_length_test.dart
@@ -104,8 +104,8 @@
         if (useHeader) {
           request.contentLength = 2;
         } else {
-          request.headers.add(HttpHeaders.CONTENT_LENGTH, "7");
-          request.headers.add(HttpHeaders.CONTENT_LENGTH, "2");
+          request.headers.add(HttpHeaders.contentLengthHeader, "7");
+          request.headers.add(HttpHeaders.contentLengthHeader, "2");
         }
         request.write("x");
         Expect.throws(
@@ -165,8 +165,8 @@
           request.contentLength = 2;
           request.headers.chunkedTransferEncoding = true;
         } else {
-          request.headers.add(HttpHeaders.CONTENT_LENGTH, "2");
-          request.headers.set(HttpHeaders.TRANSFER_ENCODING, "chunked");
+          request.headers.add(HttpHeaders.contentLengthHeader, "2");
+          request.headers.set(HttpHeaders.transferEncodingHeader, "chunked");
         }
         request.write("x");
         Expect.throws(() => request.headers.chunkedTransferEncoding = false,
diff --git a/tests/standalone_2/io/http_cross_process_test.dart b/tests/standalone_2/io/http_cross_process_test.dart
index 7408c8e..547cb92 100644
--- a/tests/standalone_2/io/http_cross_process_test.dart
+++ b/tests/standalone_2/io/http_cross_process_test.dart
@@ -25,7 +25,7 @@
 }
 
 Future makeServer() {
-  return HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+  return HttpServer.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     server.listen((request) {
       request.pipe(request.response);
     });
diff --git a/tests/standalone_2/io/http_headers_test.dart b/tests/standalone_2/io/http_headers_test.dart
index 7d08cdd..50a5fc6 100644
--- a/tests/standalone_2/io/http_headers_test.dart
+++ b/tests/standalone_2/io/http_headers_test.dart
@@ -23,39 +23,39 @@
 
 void testMultiValue() {
   _HttpHeaders headers = new _HttpHeaders("1.1");
-  Expect.isNull(headers[HttpHeaders.PRAGMA]);
-  headers.add(HttpHeaders.PRAGMA, "pragma1");
-  Expect.equals(1, headers[HttpHeaders.PRAGMA].length);
+  Expect.isNull(headers[HttpHeaders.pragmaHeader]);
+  headers.add(HttpHeaders.pragmaHeader, "pragma1");
+  Expect.equals(1, headers[HttpHeaders.pragmaHeader].length);
   Expect.equals(1, headers["pragma"].length);
   Expect.equals(1, headers["Pragma"].length);
-  Expect.equals(1, headers["PRAGMA"].length);
-  Expect.equals("pragma1", headers.value(HttpHeaders.PRAGMA));
+  Expect.equals(1, headers["pragma"].length);
+  Expect.equals("pragma1", headers.value(HttpHeaders.pragmaHeader));
 
-  headers.add(HttpHeaders.PRAGMA, "pragma2");
-  Expect.equals(2, headers[HttpHeaders.PRAGMA].length);
+  headers.add(HttpHeaders.pragmaHeader, "pragma2");
+  Expect.equals(2, headers[HttpHeaders.pragmaHeader].length);
   Expect.throws(
-      () => headers.value(HttpHeaders.PRAGMA), (e) => e is HttpException);
+      () => headers.value(HttpHeaders.pragmaHeader), (e) => e is HttpException);
 
-  headers.add(HttpHeaders.PRAGMA, ["pragma3", "pragma4"]);
+  headers.add(HttpHeaders.pragmaHeader, ["pragma3", "pragma4"]);
   Expect.listEquals(["pragma1", "pragma2", "pragma3", "pragma4"],
-      headers[HttpHeaders.PRAGMA]);
+      headers[HttpHeaders.pragmaHeader]);
 
-  headers.remove(HttpHeaders.PRAGMA, "pragma3");
-  Expect.equals(3, headers[HttpHeaders.PRAGMA].length);
+  headers.remove(HttpHeaders.pragmaHeader, "pragma3");
+  Expect.equals(3, headers[HttpHeaders.pragmaHeader].length);
   Expect.listEquals(
-      ["pragma1", "pragma2", "pragma4"], headers[HttpHeaders.PRAGMA]);
+      ["pragma1", "pragma2", "pragma4"], headers[HttpHeaders.pragmaHeader]);
 
-  headers.remove(HttpHeaders.PRAGMA, "pragma3");
-  Expect.equals(3, headers[HttpHeaders.PRAGMA].length);
+  headers.remove(HttpHeaders.pragmaHeader, "pragma3");
+  Expect.equals(3, headers[HttpHeaders.pragmaHeader].length);
 
-  headers.set(HttpHeaders.PRAGMA, "pragma5");
-  Expect.equals(1, headers[HttpHeaders.PRAGMA].length);
+  headers.set(HttpHeaders.pragmaHeader, "pragma5");
+  Expect.equals(1, headers[HttpHeaders.pragmaHeader].length);
 
-  headers.set(HttpHeaders.PRAGMA, ["pragma6", "pragma7"]);
-  Expect.equals(2, headers[HttpHeaders.PRAGMA].length);
+  headers.set(HttpHeaders.pragmaHeader, ["pragma6", "pragma7"]);
+  Expect.equals(2, headers[HttpHeaders.pragmaHeader].length);
 
-  headers.removeAll(HttpHeaders.PRAGMA);
-  Expect.isNull(headers[HttpHeaders.PRAGMA]);
+  headers.removeAll(HttpHeaders.pragmaHeader);
+  Expect.isNull(headers[HttpHeaders.pragmaHeader]);
 }
 
 void testDate() {
@@ -68,19 +68,19 @@
   Expect.isNull(headers.date);
   headers.date = date1;
   Expect.equals(date1, headers.date);
-  Expect.equals(httpDate1, headers.value(HttpHeaders.DATE));
-  Expect.equals(1, headers[HttpHeaders.DATE].length);
-  headers.add(HttpHeaders.DATE, httpDate2);
-  Expect.equals(1, headers[HttpHeaders.DATE].length);
+  Expect.equals(httpDate1, headers.value(HttpHeaders.dateHeader));
+  Expect.equals(1, headers[HttpHeaders.dateHeader].length);
+  headers.add(HttpHeaders.dateHeader, httpDate2);
+  Expect.equals(1, headers[HttpHeaders.dateHeader].length);
   Expect.equals(date2, headers.date);
-  Expect.equals(httpDate2, headers.value(HttpHeaders.DATE));
-  headers.set(HttpHeaders.DATE, httpDate1);
-  Expect.equals(1, headers[HttpHeaders.DATE].length);
+  Expect.equals(httpDate2, headers.value(HttpHeaders.dateHeader));
+  headers.set(HttpHeaders.dateHeader, httpDate1);
+  Expect.equals(1, headers[HttpHeaders.dateHeader].length);
   Expect.equals(date1, headers.date);
-  Expect.equals(httpDate1, headers.value(HttpHeaders.DATE));
+  Expect.equals(httpDate1, headers.value(HttpHeaders.dateHeader));
 
-  headers.set(HttpHeaders.DATE, "xxx");
-  Expect.equals("xxx", headers.value(HttpHeaders.DATE));
+  headers.set(HttpHeaders.dateHeader, "xxx");
+  Expect.equals("xxx", headers.value(HttpHeaders.dateHeader));
   Expect.equals(null, headers.date);
 }
 
@@ -94,19 +94,19 @@
   Expect.isNull(headers.expires);
   headers.expires = date1;
   Expect.equals(date1, headers.expires);
-  Expect.equals(httpDate1, headers.value(HttpHeaders.EXPIRES));
-  Expect.equals(1, headers[HttpHeaders.EXPIRES].length);
-  headers.add(HttpHeaders.EXPIRES, httpDate2);
-  Expect.equals(1, headers[HttpHeaders.EXPIRES].length);
+  Expect.equals(httpDate1, headers.value(HttpHeaders.expiresHeader));
+  Expect.equals(1, headers[HttpHeaders.expiresHeader].length);
+  headers.add(HttpHeaders.expiresHeader, httpDate2);
+  Expect.equals(1, headers[HttpHeaders.expiresHeader].length);
   Expect.equals(date2, headers.expires);
-  Expect.equals(httpDate2, headers.value(HttpHeaders.EXPIRES));
-  headers.set(HttpHeaders.EXPIRES, httpDate1);
-  Expect.equals(1, headers[HttpHeaders.EXPIRES].length);
+  Expect.equals(httpDate2, headers.value(HttpHeaders.expiresHeader));
+  headers.set(HttpHeaders.expiresHeader, httpDate1);
+  Expect.equals(1, headers[HttpHeaders.expiresHeader].length);
   Expect.equals(date1, headers.expires);
-  Expect.equals(httpDate1, headers.value(HttpHeaders.EXPIRES));
+  Expect.equals(httpDate1, headers.value(HttpHeaders.expiresHeader));
 
-  headers.set(HttpHeaders.EXPIRES, "xxx");
-  Expect.equals("xxx", headers.value(HttpHeaders.EXPIRES));
+  headers.set(HttpHeaders.expiresHeader, "xxx");
+  Expect.equals("xxx", headers.value(HttpHeaders.expiresHeader));
   Expect.equals(null, headers.expires);
 }
 
@@ -120,19 +120,19 @@
   Expect.isNull(headers.ifModifiedSince);
   headers.ifModifiedSince = date1;
   Expect.equals(date1, headers.ifModifiedSince);
-  Expect.equals(httpDate1, headers.value(HttpHeaders.IF_MODIFIED_SINCE));
-  Expect.equals(1, headers[HttpHeaders.IF_MODIFIED_SINCE].length);
-  headers.add(HttpHeaders.IF_MODIFIED_SINCE, httpDate2);
-  Expect.equals(1, headers[HttpHeaders.IF_MODIFIED_SINCE].length);
+  Expect.equals(httpDate1, headers.value(HttpHeaders.ifModifiedSinceHeader));
+  Expect.equals(1, headers[HttpHeaders.ifModifiedSinceHeader].length);
+  headers.add(HttpHeaders.ifModifiedSinceHeader, httpDate2);
+  Expect.equals(1, headers[HttpHeaders.ifModifiedSinceHeader].length);
   Expect.equals(date2, headers.ifModifiedSince);
-  Expect.equals(httpDate2, headers.value(HttpHeaders.IF_MODIFIED_SINCE));
-  headers.set(HttpHeaders.IF_MODIFIED_SINCE, httpDate1);
-  Expect.equals(1, headers[HttpHeaders.IF_MODIFIED_SINCE].length);
+  Expect.equals(httpDate2, headers.value(HttpHeaders.ifModifiedSinceHeader));
+  headers.set(HttpHeaders.ifModifiedSinceHeader, httpDate1);
+  Expect.equals(1, headers[HttpHeaders.ifModifiedSinceHeader].length);
   Expect.equals(date1, headers.ifModifiedSince);
-  Expect.equals(httpDate1, headers.value(HttpHeaders.IF_MODIFIED_SINCE));
+  Expect.equals(httpDate1, headers.value(HttpHeaders.ifModifiedSinceHeader));
 
-  headers.set(HttpHeaders.IF_MODIFIED_SINCE, "xxx");
-  Expect.equals("xxx", headers.value(HttpHeaders.IF_MODIFIED_SINCE));
+  headers.set(HttpHeaders.ifModifiedSinceHeader, "xxx");
+  Expect.equals("xxx", headers.value(HttpHeaders.ifModifiedSinceHeader));
   Expect.equals(null, headers.ifModifiedSince);
 }
 
@@ -142,30 +142,30 @@
   Expect.isNull(headers.host);
   Expect.isNull(headers.port);
   headers.host = host;
-  Expect.equals(host, headers.value(HttpHeaders.HOST));
+  Expect.equals(host, headers.value(HttpHeaders.hostHeader));
   headers.port = 1234;
-  Expect.equals("$host:1234", headers.value(HttpHeaders.HOST));
-  headers.port = HttpClient.DEFAULT_HTTP_PORT;
-  Expect.equals(host, headers.value(HttpHeaders.HOST));
+  Expect.equals("$host:1234", headers.value(HttpHeaders.hostHeader));
+  headers.port = HttpClient.defaultHttpPort;
+  Expect.equals(host, headers.value(HttpHeaders.hostHeader));
 
   headers = new _HttpHeaders("1.1");
-  headers.add(HttpHeaders.HOST, host);
+  headers.add(HttpHeaders.hostHeader, host);
   Expect.equals(host, headers.host);
-  Expect.equals(HttpClient.DEFAULT_HTTP_PORT, headers.port);
-  headers.add(HttpHeaders.HOST, "$host:4567");
-  Expect.equals(1, headers[HttpHeaders.HOST].length);
+  Expect.equals(HttpClient.defaultHttpPort, headers.port);
+  headers.add(HttpHeaders.hostHeader, "$host:4567");
+  Expect.equals(1, headers[HttpHeaders.hostHeader].length);
   Expect.equals(host, headers.host);
   Expect.equals(4567, headers.port);
 
   headers = new _HttpHeaders("1.1");
-  headers.add(HttpHeaders.HOST, "$host:xxx");
-  Expect.equals("$host:xxx", headers.value(HttpHeaders.HOST));
+  headers.add(HttpHeaders.hostHeader, "$host:xxx");
+  Expect.equals("$host:xxx", headers.value(HttpHeaders.hostHeader));
   Expect.equals(host, headers.host);
   Expect.isNull(headers.port);
 
   headers = new _HttpHeaders("1.1");
-  headers.add(HttpHeaders.HOST, ":1234");
-  Expect.equals(":1234", headers.value(HttpHeaders.HOST));
+  headers.add(HttpHeaders.hostHeader, ":1234");
+  Expect.equals(":1234", headers.value(HttpHeaders.hostHeader));
   Expect.isNull(headers.host);
   Expect.equals(1234, headers.port);
 }
@@ -218,7 +218,7 @@
 
 void testEnumeration() {
   _HttpHeaders headers = new _HttpHeaders("1.1");
-  Expect.isNull(headers[HttpHeaders.PRAGMA]);
+  Expect.isNull(headers[HttpHeaders.pragmaHeader]);
   headers.add("My-Header-1", "value 1");
   headers.add("My-Header-2", "value 2");
   headers.add("My-Header-1", "value 3");
@@ -355,10 +355,10 @@
   check(contentType, "text", "html", {"charset": null});
 
   // Test builtin content types.
-  check(ContentType.TEXT, "text", "plain", {"charset": "utf-8"});
-  check(ContentType.HTML, "text", "html", {"charset": "utf-8"});
-  check(ContentType.JSON, "application", "json", {"charset": "utf-8"});
-  check(ContentType.BINARY, "application", "octet-stream");
+  check(ContentType.text, "text", "plain", {"charset": "utf-8"});
+  check(ContentType.html, "text", "html", {"charset": "utf-8"});
+  check(ContentType.json, "application", "json", {"charset": "utf-8"});
+  check(ContentType.binary, "application", "octet-stream");
 }
 
 void testKnownContentTypes() {
@@ -377,15 +377,15 @@
 
 void testContentTypeCache() {
   _HttpHeaders headers = new _HttpHeaders("1.1");
-  headers.set(HttpHeaders.CONTENT_TYPE, "text/html");
+  headers.set(HttpHeaders.contentTypeHeader, "text/html");
   Expect.equals("text", headers.contentType.primaryType);
   Expect.equals("html", headers.contentType.subType);
   Expect.equals("text/html", headers.contentType.value);
-  headers.set(HttpHeaders.CONTENT_TYPE, "text/plain; charset=utf-8");
+  headers.set(HttpHeaders.contentTypeHeader, "text/plain; charset=utf-8");
   Expect.equals("text", headers.contentType.primaryType);
   Expect.equals("plain", headers.contentType.subType);
   Expect.equals("text/plain", headers.contentType.value);
-  headers.removeAll(HttpHeaders.CONTENT_TYPE);
+  headers.removeAll(HttpHeaders.contentTypeHeader);
   Expect.isNull(headers.contentType);
 }
 
@@ -514,10 +514,10 @@
 }
 
 void testHeaderLists() {
-  HttpHeaders.GENERAL_HEADERS.forEach((x) => null);
-  HttpHeaders.ENTITY_HEADERS.forEach((x) => null);
-  HttpHeaders.RESPONSE_HEADERS.forEach((x) => null);
-  HttpHeaders.REQUEST_HEADERS.forEach((x) => null);
+  HttpHeaders.generalHeaders.forEach((x) => null);
+  HttpHeaders.entityHeaders.forEach((x) => null);
+  HttpHeaders.responseHeaders.forEach((x) => null);
+  HttpHeaders.requestHeaders.forEach((x) => null);
 }
 
 void testInvalidFieldName() {
diff --git a/tests/standalone_2/io/http_ipv6_test.dart b/tests/standalone_2/io/http_ipv6_test.dart
index fe61c08..4c1c1df 100644
--- a/tests/standalone_2/io/http_ipv6_test.dart
+++ b/tests/standalone_2/io/http_ipv6_test.dart
@@ -32,7 +32,7 @@
         .openUrl('GET', url)
         .then((request) => request.close())
         .then((response) {
-      Expect.equals(response.statusCode, HttpStatus.OK);
+      Expect.equals(response.statusCode, HttpStatus.ok);
     }).whenComplete(() {
       server.close();
       client.close();
diff --git a/tests/standalone_2/io/http_loopback_test.dart b/tests/standalone_2/io/http_loopback_test.dart
index d240996a..11e2b16 100644
--- a/tests/standalone_2/io/http_loopback_test.dart
+++ b/tests/standalone_2/io/http_loopback_test.dart
@@ -10,19 +10,18 @@
 
 serverListen(RawSocket serverSide) {
   serveData(RawSocketEvent event) {
-    serverSide.shutdown(SocketDirection.SEND);
+    serverSide.shutdown(SocketDirection.send);
   }
 
   serverSide.listen(serveData);
 }
 
 IPv4ToIPv6FailureTest() async {
-  server = await RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V6, 0);
+  server = await RawServerSocket.bind(InternetAddress.loopbackIPv6, 0);
   server.listen(serverListen);
   bool testFailure = false;
   try {
-    client =
-        await RawSocket.connect(InternetAddress.LOOPBACK_IP_V4, server.port);
+    client = await RawSocket.connect(InternetAddress.loopbackIPv4, server.port);
     await client.close();
     testFailure = true;
   } on SocketException catch (e) {
@@ -37,12 +36,11 @@
 }
 
 IPv6ToIPv4FailureTest() async {
-  server = await RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0);
+  server = await RawServerSocket.bind(InternetAddress.loopbackIPv4, 0);
   server.listen(serverListen);
   bool testFailure = false;
   try {
-    client =
-        await RawSocket.connect(InternetAddress.LOOPBACK_IP_V6, server.port);
+    client = await RawSocket.connect(InternetAddress.loopbackIPv6, server.port);
     await client.close();
     testFailure = true;
   } on SocketException catch (e) {
@@ -74,6 +72,6 @@
 main() async {
   await IPv4ToIPv6FailureTest();
   await IPv6ToIPv4FailureTest();
-  await loopbackSuccessTest(InternetAddress.LOOPBACK_IP_V4);
-  await loopbackSuccessTest(InternetAddress.LOOPBACK_IP_V6);
+  await loopbackSuccessTest(InternetAddress.loopbackIPv4);
+  await loopbackSuccessTest(InternetAddress.loopbackIPv6);
 }
diff --git a/tests/standalone_2/io/http_no_reason_phrase_test.dart b/tests/standalone_2/io/http_no_reason_phrase_test.dart
index 23e53fc..2a1558e 100644
--- a/tests/standalone_2/io/http_no_reason_phrase_test.dart
+++ b/tests/standalone_2/io/http_no_reason_phrase_test.dart
@@ -37,8 +37,8 @@
 }
 
 void main() {
-  missingReasonPhrase(HttpStatus.OK, true);
-  missingReasonPhrase(HttpStatus.INTERNAL_SERVER_ERROR, true);
-  missingReasonPhrase(HttpStatus.OK, false);
-  missingReasonPhrase(HttpStatus.INTERNAL_SERVER_ERROR, false);
+  missingReasonPhrase(HttpStatus.ok, true);
+  missingReasonPhrase(HttpStatus.internalServerError, true);
+  missingReasonPhrase(HttpStatus.ok, false);
+  missingReasonPhrase(HttpStatus.internalServerError, false);
 }
diff --git a/tests/standalone_2/io/http_outgoing_size_test.dart b/tests/standalone_2/io/http_outgoing_size_test.dart
index c84708a..06a33a8 100644
--- a/tests/standalone_2/io/http_outgoing_size_test.dart
+++ b/tests/standalone_2/io/http_outgoing_size_test.dart
@@ -34,7 +34,7 @@
     });
     var client = new HttpClient();
     client.get('127.0.0.1', server.port, '/').then((request) {
-      request.headers.set(HttpHeaders.ACCEPT_ENCODING, "");
+      request.headers.set(HttpHeaders.acceptEncodingHeader, "");
       return request.close();
     }).then((response) {
       var buffer = [];
diff --git a/tests/standalone_2/io/http_proxy_advanced_test.dart b/tests/standalone_2/io/http_proxy_advanced_test.dart
index fda2388..c6d0af2 100644
--- a/tests/standalone_2/io/http_proxy_advanced_test.dart
+++ b/tests/standalone_2/io/http_proxy_advanced_test.dart
@@ -50,12 +50,12 @@
     bool direct = directRequestPaths.fold(
         false, (prev, path) => prev ? prev : path == request.uri.path);
     if (!secure && !direct && proxyHops > 0) {
-      Expect.isNotNull(request.headers[HttpHeaders.VIA]);
-      Expect.equals(1, request.headers[HttpHeaders.VIA].length);
-      Expect.equals(
-          proxyHops, request.headers[HttpHeaders.VIA][0].split(",").length);
+      Expect.isNotNull(request.headers[HttpHeaders.viaHeader]);
+      Expect.equals(1, request.headers[HttpHeaders.viaHeader].length);
+      Expect.equals(proxyHops,
+          request.headers[HttpHeaders.viaHeader][0].split(",").length);
     } else {
-      Expect.isNull(request.headers[HttpHeaders.VIA]);
+      Expect.isNull(request.headers[HttpHeaders.viaHeader]);
     }
     var body = new StringBuffer();
     onRequestComplete() {
@@ -125,8 +125,8 @@
     request.fold(null, (x, y) {}).then((_) {
       var response = request.response;
       response.headers
-          .set(HttpHeaders.PROXY_AUTHENTICATE, "Basic, realm=$realm");
-      response.statusCode = HttpStatus.PROXY_AUTHENTICATION_REQUIRED;
+          .set(HttpHeaders.proxyAuthenticateHeader, "Basic, realm=$realm");
+      response.statusCode = HttpStatus.proxyAuthenticationRequired;
       response.close();
     });
   }
@@ -134,7 +134,7 @@
   digestAuthenticationRequired(request, {stale: false}) {
     request.fold(null, (x, y) {}).then((_) {
       var response = request.response;
-      response.statusCode = HttpStatus.PROXY_AUTHENTICATION_REQUIRED;
+      response.statusCode = HttpStatus.proxyAuthenticationRequired;
       StringBuffer authHeader = new StringBuffer();
       authHeader.write('Digest');
       authHeader.write(', realm="$realm"');
@@ -144,7 +144,7 @@
         authHeader.write(', algorithm=$serverAlgorithm');
       }
       if (serverQop != null) authHeader.write(', qop="$serverQop"');
-      response.headers.set(HttpHeaders.PROXY_AUTHENTICATE, authHeader);
+      response.headers.set(HttpHeaders.proxyAuthenticateHeader, authHeader);
       response.close();
     });
   }
@@ -158,7 +158,7 @@
       server.listen((HttpRequest request) {
         requestCount++;
         if (username != null && password != null) {
-          if (request.headers[HttpHeaders.PROXY_AUTHORIZATION] == null) {
+          if (request.headers[HttpHeaders.proxyAuthorizationHeader] == null) {
             if (authScheme == "Digest") {
               digestAuthenticationRequired(request);
             } else {
@@ -166,10 +166,10 @@
             }
             return;
           } else {
-            Expect.equals(
-                1, request.headers[HttpHeaders.PROXY_AUTHORIZATION].length);
+            Expect.equals(1,
+                request.headers[HttpHeaders.proxyAuthorizationHeader].length);
             String authorization =
-                request.headers[HttpHeaders.PROXY_AUTHORIZATION][0];
+                request.headers[HttpHeaders.proxyAuthorizationHeader][0];
             if (authScheme == "Basic") {
               List<String> tokens = authorization.split(" ");
               Expect.equals("Basic", tokens[0]);
@@ -251,10 +251,10 @@
             });
             // Special handling of Content-Length and Via.
             clientRequest.contentLength = request.contentLength;
-            List<String> via = request.headers[HttpHeaders.VIA];
+            List<String> via = request.headers[HttpHeaders.viaHeader];
             String viaPrefix = via == null ? "" : "${via[0]}, ";
             clientRequest.headers
-                .add(HttpHeaders.VIA, "${viaPrefix}1.1 localhost:$port");
+                .add(HttpHeaders.viaHeader, "${viaPrefix}1.1 localhost:$port");
             // Copy all content.
             return request.pipe(clientRequest);
           }).then((clientResponse) {
@@ -460,7 +460,7 @@
               }).then((HttpClientResponse response) {
                 response.listen((_) {}, onDone: () {
                   testProxyAuthenticateCount++;
-                  Expect.equals(HttpStatus.OK, response.statusCode);
+                  Expect.equals(HttpStatus.ok, response.statusCode);
                   if (testProxyAuthenticateCount == loopCount * 2) {
                     Expect.equals(loopCount, server.requestCount);
                     Expect.equals(loopCount, secureServer.requestCount);
@@ -502,7 +502,7 @@
               }).then((HttpClientResponse response) {
                 response.listen((_) {}, onDone: () {
                   testProxyAuthenticateCount++;
-                  Expect.equals(HttpStatus.OK, response.statusCode);
+                  Expect.equals(HttpStatus.ok, response.statusCode);
                   if (testProxyAuthenticateCount == loopCount * 2) {
                     Expect.equals(loopCount * 2, server.requestCount);
                     Expect.equals(loopCount * 2, secureServer.requestCount);
diff --git a/tests/standalone_2/io/http_proxy_test.dart b/tests/standalone_2/io/http_proxy_test.dart
index bd07700..885af5d 100644
--- a/tests/standalone_2/io/http_proxy_test.dart
+++ b/tests/standalone_2/io/http_proxy_test.dart
@@ -49,12 +49,12 @@
     bool direct = directRequestPaths.fold(
         false, (prev, path) => prev ? prev : path == request.uri.path);
     if (!secure && !direct && proxyHops > 0) {
-      Expect.isNotNull(request.headers[HttpHeaders.VIA]);
-      Expect.equals(1, request.headers[HttpHeaders.VIA].length);
-      Expect.equals(
-          proxyHops, request.headers[HttpHeaders.VIA][0].split(",").length);
+      Expect.isNotNull(request.headers[HttpHeaders.viaHeader]);
+      Expect.equals(1, request.headers[HttpHeaders.viaHeader].length);
+      Expect.equals(proxyHops,
+          request.headers[HttpHeaders.viaHeader][0].split(",").length);
     } else {
-      Expect.isNull(request.headers[HttpHeaders.VIA]);
+      Expect.isNull(request.headers[HttpHeaders.viaHeader]);
     }
     var body = new StringBuffer();
     onRequestComplete() {
@@ -114,8 +114,8 @@
     request.fold(null, (x, y) {}).then((_) {
       var response = request.response;
       response.headers
-          .set(HttpHeaders.PROXY_AUTHENTICATE, "Basic, realm=$realm");
-      response.statusCode = HttpStatus.PROXY_AUTHENTICATION_REQUIRED;
+          .set(HttpHeaders.proxyAuthenticateHeader, "Basic, realm=$realm");
+      response.statusCode = HttpStatus.proxyAuthenticationRequired;
       response.close();
     });
   }
@@ -123,7 +123,7 @@
   digestAuthenticationRequired(request, {stale: false}) {
     request.fold(null, (x, y) {}).then((_) {
       var response = request.response;
-      response.statusCode = HttpStatus.PROXY_AUTHENTICATION_REQUIRED;
+      response.statusCode = HttpStatus.proxyAuthenticationRequired;
       StringBuffer authHeader = new StringBuffer();
       authHeader.write('Digest');
       authHeader.write(', realm="$realm"');
@@ -133,7 +133,7 @@
         authHeader.write(', algorithm=$serverAlgorithm');
       }
       if (serverQop != null) authHeader.write(', qop="$serverQop"');
-      response.headers.set(HttpHeaders.PROXY_AUTHENTICATE, authHeader);
+      response.headers.set(HttpHeaders.proxyAuthenticateHeader, authHeader);
       response.close();
     });
   }
@@ -147,7 +147,7 @@
       server.listen((HttpRequest request) {
         requestCount++;
         if (username != null && password != null) {
-          if (request.headers[HttpHeaders.PROXY_AUTHORIZATION] == null) {
+          if (request.headers[HttpHeaders.proxyAuthorizationHeader] == null) {
             if (authScheme == "Digest") {
               digestAuthenticationRequired(request);
             } else {
@@ -155,10 +155,10 @@
             }
             return;
           } else {
-            Expect.equals(
-                1, request.headers[HttpHeaders.PROXY_AUTHORIZATION].length);
+            Expect.equals(1,
+                request.headers[HttpHeaders.proxyAuthorizationHeader].length);
             String authorization =
-                request.headers[HttpHeaders.PROXY_AUTHORIZATION][0];
+                request.headers[HttpHeaders.proxyAuthorizationHeader][0];
             if (authScheme == "Basic") {
               List<String> tokens = authorization.split(" ");
               Expect.equals("Basic", tokens[0]);
@@ -239,10 +239,10 @@
             });
             // Special handling of Content-Length and Via.
             clientRequest.contentLength = request.contentLength;
-            List<String> via = request.headers[HttpHeaders.VIA];
+            List<String> via = request.headers[HttpHeaders.viaHeader];
             String viaPrefix = via == null ? "" : "${via[0]}, ";
             clientRequest.headers
-                .add(HttpHeaders.VIA, "${viaPrefix}1.1 localhost:$port");
+                .add(HttpHeaders.viaHeader, "${viaPrefix}1.1 localhost:$port");
             // Copy all content.
             return request.pipe(clientRequest);
           }).then((clientResponse) {
diff --git a/tests/standalone_2/io/http_read_test.dart b/tests/standalone_2/io/http_read_test.dart
index 3fcab15..aeb2174 100644
--- a/tests/standalone_2/io/http_read_test.dart
+++ b/tests/standalone_2/io/http_read_test.dart
@@ -113,7 +113,7 @@
   // Return a 404.
   void _notFoundHandler(HttpRequest request) {
     var response = request.response;
-    response.statusCode = HttpStatus.NOT_FOUND;
+    response.statusCode = HttpStatus.notFound;
     response.headers.set("Content-Type", "text/html; charset=UTF-8");
     response.write("Page not found");
     response.close();
@@ -186,7 +186,7 @@
         }
         return request.close();
       }).then((response) {
-        Expect.equals(HttpStatus.OK, response.statusCode);
+        Expect.equals(HttpStatus.ok, response.statusCode);
         List<int> body = new List<int>();
         response.listen(body.addAll, onDone: () {
           Expect.equals(data, new String.fromCharCodes(body));
diff --git a/tests/standalone_2/io/http_redirect_test.dart b/tests/standalone_2/io/http_redirect_test.dart
index 45e778c..9155a42 100644
--- a/tests/standalone_2/io/http_redirect_test.dart
+++ b/tests/standalone_2/io/http_redirect_test.dart
@@ -39,7 +39,7 @@
     addRequestHandler("/redirect",
         (HttpRequest request, HttpResponse response) {
       response.redirect(Uri.parse("http://127.0.0.1:${server.port}/location"),
-          status: HttpStatus.MOVED_PERMANENTLY);
+          status: HttpStatus.movedPermanently);
     });
     addRequestHandler("/location",
         (HttpRequest request, HttpResponse response) {
@@ -49,15 +49,15 @@
     // Setup redirects with relative url.
     addRequestHandler("/redirectUrl",
         (HttpRequest request, HttpResponse response) {
-      response.headers.set(HttpHeaders.LOCATION, "/some/relativeUrl");
-      response.statusCode = HttpStatus.MOVED_PERMANENTLY;
+      response.headers.set(HttpHeaders.locationHeader, "/some/relativeUrl");
+      response.statusCode = HttpStatus.movedPermanently;
       response.close();
     });
 
     addRequestHandler("/some/redirectUrl",
         (HttpRequest request, HttpResponse response) {
-      response.headers.set(HttpHeaders.LOCATION, "relativeUrl");
-      response.statusCode = HttpStatus.MOVED_PERMANENTLY;
+      response.headers.set(HttpHeaders.locationHeader, "relativeUrl");
+      response.statusCode = HttpStatus.movedPermanently;
       response.close();
     });
 
@@ -68,68 +68,68 @@
 
     addRequestHandler("/some/relativeToAbsolute",
         (HttpRequest request, HttpResponse response) {
-      response.redirect(Uri.parse("xxx"), status: HttpStatus.SEE_OTHER);
+      response.redirect(Uri.parse("xxx"), status: HttpStatus.seeOther);
     });
 
     addRequestHandler("/redirectUrl2",
         (HttpRequest request, HttpResponse response) {
-      response.headers.set(HttpHeaders.LOCATION, "location");
-      response.statusCode = HttpStatus.MOVED_PERMANENTLY;
+      response.headers.set(HttpHeaders.locationHeader, "location");
+      response.statusCode = HttpStatus.movedPermanently;
       response.close();
     });
 
     addRequestHandler("/redirectUrl3",
         (HttpRequest request, HttpResponse response) {
-      response.headers.set(HttpHeaders.LOCATION, "./location");
-      response.statusCode = HttpStatus.MOVED_PERMANENTLY;
+      response.headers.set(HttpHeaders.locationHeader, "./location");
+      response.statusCode = HttpStatus.movedPermanently;
       response.close();
     });
 
     addRequestHandler("/redirectUrl4",
         (HttpRequest request, HttpResponse response) {
-      response.headers.set(HttpHeaders.LOCATION, "./a/b/../../location");
-      response.statusCode = HttpStatus.MOVED_PERMANENTLY;
+      response.headers.set(HttpHeaders.locationHeader, "./a/b/../../location");
+      response.statusCode = HttpStatus.movedPermanently;
       response.close();
     });
 
     addRequestHandler("/redirectUrl5",
         (HttpRequest request, HttpResponse response) {
-      response.headers
-          .set(HttpHeaders.LOCATION, "//127.0.0.1:${server.port}/location");
-      response.statusCode = HttpStatus.MOVED_PERMANENTLY;
+      response.headers.set(
+          HttpHeaders.locationHeader, "//127.0.0.1:${server.port}/location");
+      response.statusCode = HttpStatus.movedPermanently;
       response.close();
     });
 
     // Setup redirect chain.
     int n = 1;
-    addRedirectHandler(n++, HttpStatus.MOVED_PERMANENTLY);
-    addRedirectHandler(n++, HttpStatus.MOVED_TEMPORARILY);
-    addRedirectHandler(n++, HttpStatus.SEE_OTHER);
-    addRedirectHandler(n++, HttpStatus.TEMPORARY_REDIRECT);
+    addRedirectHandler(n++, HttpStatus.movedPermanently);
+    addRedirectHandler(n++, HttpStatus.movedTemporarily);
+    addRedirectHandler(n++, HttpStatus.seeOther);
+    addRedirectHandler(n++, HttpStatus.temporaryRedirect);
     for (int i = n; i < 10; i++) {
-      addRedirectHandler(i, HttpStatus.MOVED_PERMANENTLY);
+      addRedirectHandler(i, HttpStatus.movedPermanently);
     }
 
     // Setup redirect loop.
     addRequestHandler("/A", (HttpRequest request, HttpResponse response) {
       response.headers
-          .set(HttpHeaders.LOCATION, "http://127.0.0.1:${server.port}/B");
-      response.statusCode = HttpStatus.MOVED_PERMANENTLY;
+          .set(HttpHeaders.locationHeader, "http://127.0.0.1:${server.port}/B");
+      response.statusCode = HttpStatus.movedPermanently;
       response.close();
     });
     addRequestHandler("/B", (HttpRequest request, HttpResponse response) {
       response.headers
-          .set(HttpHeaders.LOCATION, "http://127.0.0.1:${server.port}/A");
-      response.statusCode = HttpStatus.MOVED_TEMPORARILY;
+          .set(HttpHeaders.locationHeader, "http://127.0.0.1:${server.port}/A");
+      response.statusCode = HttpStatus.movedTemporarily;
       response.close();
     });
 
     // Setup redirect checking headers.
     addRequestHandler("/src", (HttpRequest request, HttpResponse response) {
       Expect.equals("value", request.headers.value("X-Request-Header"));
-      response.headers
-          .set(HttpHeaders.LOCATION, "http://127.0.0.1:${server.port}/target");
-      response.statusCode = HttpStatus.MOVED_PERMANENTLY;
+      response.headers.set(
+          HttpHeaders.locationHeader, "http://127.0.0.1:${server.port}/target");
+      response.statusCode = HttpStatus.movedPermanently;
       response.close();
     });
     addRequestHandler("/target", (HttpRequest request, HttpResponse response) {
@@ -141,9 +141,9 @@
     addRequestHandler("/301src", (HttpRequest request, HttpResponse response) {
       Expect.equals("POST", request.method);
       request.listen((_) {}, onDone: () {
-        response.headers.set(
-            HttpHeaders.LOCATION, "http://127.0.0.1:${server.port}/301target");
-        response.statusCode = HttpStatus.MOVED_PERMANENTLY;
+        response.headers.set(HttpHeaders.locationHeader,
+            "http://127.0.0.1:${server.port}/301target");
+        response.statusCode = HttpStatus.movedPermanently;
         response.close();
       });
     });
@@ -156,9 +156,9 @@
     addRequestHandler("/303src", (HttpRequest request, HttpResponse response) {
       request.listen((_) {}, onDone: () {
         Expect.equals("POST", request.method);
-        response.headers.set(
-            HttpHeaders.LOCATION, "http://127.0.0.1:${server.port}/303target");
-        response.statusCode = HttpStatus.SEE_OTHER;
+        response.headers.set(HttpHeaders.locationHeader,
+            "http://127.0.0.1:${server.port}/303target");
+        response.statusCode = HttpStatus.seeOther;
         response.close();
       });
     });
@@ -171,8 +171,8 @@
     // Setup redirect where we close the connection.
     addRequestHandler("/closing", (HttpRequest request, HttpResponse response) {
       response.headers
-          .set(HttpHeaders.LOCATION, "http://127.0.0.1:${server.port}/");
-      response.statusCode = HttpStatus.FOUND;
+          .set(HttpHeaders.locationHeader, "http://127.0.0.1:${server.port}/");
+      response.statusCode = HttpStatus.found;
       response.persistentConnection = false;
       response.close();
     });
@@ -207,7 +207,7 @@
           checkRedirects(redirectCount, response);
           response.redirect().then(handleResponse);
         } else {
-          Expect.equals(HttpStatus.NOT_FOUND, response.statusCode);
+          Expect.equals(HttpStatus.notFound, response.statusCode);
           server.close();
           client.close();
         }
@@ -237,7 +237,7 @@
           Expect.isTrue(response.isRedirect);
           response.redirect().then(handleResponse);
         } else {
-          Expect.equals(HttpStatus.OK, response.statusCode);
+          Expect.equals(HttpStatus.ok, response.statusCode);
           server.close();
           client.close();
         }
@@ -302,7 +302,7 @@
         .then((HttpClientRequest request) {
       return request.close();
     }).then((HttpClientResponse response) {
-      Expect.equals(HttpStatus.MOVED_PERMANENTLY, response.statusCode);
+      Expect.equals(HttpStatus.movedPermanently, response.statusCode);
       response.listen((_) => Expect.fail("Response data not expected"),
           onDone: () {
         Expect.equals(0, response.redirects.length);
@@ -322,7 +322,7 @@
         .then((HttpClientRequest request) {
       return request.close();
     }).then((HttpClientResponse response) {
-      Expect.equals(HttpStatus.OK, response.statusCode);
+      Expect.equals(HttpStatus.ok, response.statusCode);
       response.listen((_) => Expect.fail("Response data not expected"),
           onDone: () {
         Expect.equals(1, response.redirects.length);
@@ -392,7 +392,7 @@
           .then((request) => request.close())
           .then((response) {
         response.listen((_) {}, onDone: () {
-          Expect.equals(HttpStatus.OK, response.statusCode);
+          Expect.equals(HttpStatus.ok, response.statusCode);
           Expect.equals(1, response.redirects.length);
           server.close();
           client.close();
@@ -417,7 +417,7 @@
     handleResponse(HttpClientResponse response) {
       response.listen((_) => Expect.fail("Response data not expected"),
           onDone: () {
-        Expect.equals(HttpStatus.SEE_OTHER, response.statusCode);
+        Expect.equals(HttpStatus.seeOther, response.statusCode);
         Expect.equals("xxx", response.headers["Location"][0]);
         Expect.isTrue(response.isRedirect);
         server.close();
diff --git a/tests/standalone_2/io/http_server_test.dart b/tests/standalone_2/io/http_server_test.dart
index 1a9829d..b36fd7e 100644
--- a/tests/standalone_2/io/http_server_test.dart
+++ b/tests/standalone_2/io/http_server_test.dart
@@ -12,21 +12,21 @@
 void testDefaultResponseHeaders() {
   checkDefaultHeaders(headers) {
     Expect.listEquals(
-        headers[HttpHeaders.CONTENT_TYPE], ['text/plain; charset=utf-8']);
+        headers[HttpHeaders.contentTypeHeader], ['text/plain; charset=utf-8']);
     Expect.listEquals(headers['X-Frame-Options'], ['SAMEORIGIN']);
     Expect.listEquals(headers['X-Content-Type-Options'], ['nosniff']);
     Expect.listEquals(headers['X-XSS-Protection'], ['1; mode=block']);
   }
 
   checkDefaultHeadersClear(headers) {
-    Expect.isNull(headers[HttpHeaders.CONTENT_TYPE]);
+    Expect.isNull(headers[HttpHeaders.contentTypeHeader]);
     Expect.isNull(headers['X-Frame-Options']);
     Expect.isNull(headers['X-Content-Type-Options']);
     Expect.isNull(headers['X-XSS-Protection']);
   }
 
   checkDefaultHeadersClearAB(headers) {
-    Expect.isNull(headers[HttpHeaders.CONTENT_TYPE]);
+    Expect.isNull(headers[HttpHeaders.contentTypeHeader]);
     Expect.isNull(headers['X-Frame-Options']);
     Expect.isNull(headers['X-Content-Type-Options']);
     Expect.isNull(headers['X-XSS-Protection']);
diff --git a/tests/standalone_2/io/https_unauthorized_client.dart b/tests/standalone_2/io/https_unauthorized_client.dart
index 57d9bc6..6b7e8f6 100644
--- a/tests/standalone_2/io/https_unauthorized_client.dart
+++ b/tests/standalone_2/io/https_unauthorized_client.dart
@@ -26,7 +26,7 @@
 Future runClients(int port) {
   HttpClient client = new HttpClient();
 
-  var testFutures = [];
+  var testFutures = <Future>[];
   for (int i = 0; i < 20; ++i) {
     testFutures.add(client.getUrl(Uri.parse('https://$HOST_NAME:$port/')).then(
         (HttpClientRequest request) {
diff --git a/tests/standalone_2/io/issue_22637_test.dart b/tests/standalone_2/io/issue_22637_test.dart
index c464e56..0524ce9 100644
--- a/tests/standalone_2/io/issue_22637_test.dart
+++ b/tests/standalone_2/io/issue_22637_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.
 //
-// This test checks that a shutdown(SocketDirection.SEND) of a socket,
+// This test checks that a shutdown(SocketDirection.send) of a socket,
 // when the other end is already closed, does not discard unread data
 // that remains in the connection.
 
diff --git a/tests/standalone_2/io/namespace_test.dart b/tests/standalone_2/io/namespace_test.dart
index 426aed7..73ab607 100644
--- a/tests/standalone_2/io/namespace_test.dart
+++ b/tests/standalone_2/io/namespace_test.dart
@@ -91,7 +91,7 @@
   Expect.isFalse(dir4.existsSync());
   // stat.
   FileStat dirstat = dir2.statSync();
-  Expect.equals(FileSystemEntityType.DIRECTORY, dirstat.type);
+  Expect.equals(FileSystemEntityType.directory, dirstat.type);
 }
 
 doTestAsync() async {
@@ -177,7 +177,7 @@
   Expect.isFalse(await dir4.exists());
   // stat.
   FileStat dirstat = await dir2.stat();
-  Expect.equals(FileSystemEntityType.DIRECTORY, dirstat.type);
+  Expect.equals(FileSystemEntityType.directory, dirstat.type);
 }
 
 List<String> packageOptions() {
diff --git a/tests/standalone_2/io/platform_resolved_executable_test.dart b/tests/standalone_2/io/platform_resolved_executable_test.dart
index 3dbbd7c..14be3b5 100644
--- a/tests/standalone_2/io/platform_resolved_executable_test.dart
+++ b/tests/standalone_2/io/platform_resolved_executable_test.dart
@@ -40,7 +40,7 @@
 
 void testDartExecShouldNotBeInCurrentDir() {
   var type = FileSystemEntity.typeSync(platformExeName);
-  expectEquals(FileSystemEntityType.NOT_FOUND, type);
+  expectEquals(FileSystemEntityType.notFound, type);
 }
 
 void testShouldFailOutsidePath() {
diff --git a/tests/standalone_2/io/process_check_arguments_script.dart b/tests/standalone_2/io/process_check_arguments_script.dart
index 76cff03..4c19479 100644
--- a/tests/standalone_2/io/process_check_arguments_script.dart
+++ b/tests/standalone_2/io/process_check_arguments_script.dart
@@ -10,13 +10,13 @@
 class Expect {
   static void isTrue(x) {
     if (!x) {
-      throw new Error("Not true");
+      throw new StateError("Not true");
     }
   }
 
   static void equals(x, y) {
     if (x != y) {
-      throw new Error("Not equal");
+      throw new StateError("Not equal");
     }
   }
 }
diff --git a/tests/standalone_2/io/raw_socket_test.dart b/tests/standalone_2/io/raw_socket_test.dart
index 27ad20c..f5506cc 100644
--- a/tests/standalone_2/io/raw_socket_test.dart
+++ b/tests/standalone_2/io/raw_socket_test.dart
@@ -90,7 +90,7 @@
     server.listen((serverConnection) {
       serverConnection.listen((event) {
         if (toClose == "server" || event == RawSocketEvent.readClosed) {
-          serverConnection.shutdown(SocketDirection.SEND);
+          serverConnection.shutdown(SocketDirection.send);
         }
       }, onDone: () {
         serverEndDone.complete(null);
@@ -101,7 +101,7 @@
     RawSocket.connect("127.0.0.1", server.port).then((clientConnection) {
       clientConnection.listen((event) {
         if (toClose == "client" || event == RawSocketEvent.readClosed) {
-          clientConnection.shutdown(SocketDirection.SEND);
+          clientConnection.shutdown(SocketDirection.send);
         }
       }, onDone: () {
         clientEndDone.complete(null);
@@ -186,7 +186,7 @@
               client.writeEventsEnabled = true;
             }
             if (bytesWritten == data.length) {
-              client.shutdown(SocketDirection.SEND);
+              client.shutdown(SocketDirection.send);
             }
             break;
           case RawSocketEvent.readClosed:
diff --git a/tests/standalone_2/io/regress_7679_test.dart b/tests/standalone_2/io/regress_7679_test.dart
index 6402237..63f11d3 100644
--- a/tests/standalone_2/io/regress_7679_test.dart
+++ b/tests/standalone_2/io/regress_7679_test.dart
@@ -14,7 +14,7 @@
 class Expect {
   static void isTrue(var x) {
     if (!identical(x, true)) {
-      throw new Error("Not identical");
+      throw new StateError("Not identical");
     }
   }
 }
diff --git a/tests/standalone_2/io/secure_unauthorized_client.dart b/tests/standalone_2/io/secure_unauthorized_client.dart
index f08e92b..c830c96 100644
--- a/tests/standalone_2/io/secure_unauthorized_client.dart
+++ b/tests/standalone_2/io/secure_unauthorized_client.dart
@@ -28,7 +28,7 @@
 const HOST_NAME = "localhost";
 
 Future runClients(int port) {
-  var testFutures = [];
+  var testFutures = <Future>[];
   for (int i = 0; i < 20; ++i) {
     testFutures.add(SecureSocket
         .connect(HOST_NAME, port, context: clientContext)
diff --git a/tests/standalone_2/io/socket_info_ipv4_test.dart b/tests/standalone_2/io/socket_info_ipv4_test.dart
index bce4f78..64e373f 100644
--- a/tests/standalone_2/io/socket_info_ipv4_test.dart
+++ b/tests/standalone_2/io/socket_info_ipv4_test.dart
@@ -13,7 +13,7 @@
         Expect.equals(clientSocket.port, socket.remotePort);
         Expect.equals(clientSocket.remotePort, socket.port);
         Expect.equals(socket.remoteAddress.address, "127.0.0.1");
-        Expect.equals(socket.remoteAddress.type, InternetAddressType.IP_V4);
+        Expect.equals(socket.remoteAddress.type, InternetAddressType.IPv4);
         Expect.listEquals(socket.remoteAddress.rawAddress, [127, 0, 0, 1]);
         Expect.equals(clientSocket.remoteAddress.address, "127.0.0.1");
         Expect.equals(
diff --git a/tests/standalone_2/io/web_socket_compression_test.dart b/tests/standalone_2/io/web_socket_compression_test.dart
index 1e558ae..7ea3baa 100644
--- a/tests/standalone_2/io/web_socket_compression_test.dart
+++ b/tests/standalone_2/io/web_socket_compression_test.dart
@@ -67,12 +67,12 @@
         // If the URL contains user information use that for basic
         // authorization.
         String auth = base64.encode(utf8.encode(uri.userInfo));
-        request.headers.set(HttpHeaders.AUTHORIZATION, "Basic $auth");
+        request.headers.set(HttpHeaders.authorizationHeader, "Basic $auth");
       }
       // Setup the initial handshake.
       request.headers
-        ..set(HttpHeaders.CONNECTION, "Upgrade")
-        ..set(HttpHeaders.UPGRADE, "websocket")
+        ..set(HttpHeaders.connectionHeader, "Upgrade")
+        ..set(HttpHeaders.upgradeHeader, "websocket")
         ..set("Sec-WebSocket-Key", nonce)
         ..set("Cache-Control", "no-cache")
         ..set("Sec-WebSocket-Version", "13")
@@ -168,16 +168,18 @@
     asyncStart();
     createServer().then((server) {
       server.listen((request) {
-        Expect.equals('Upgrade', request.headers.value(HttpHeaders.CONNECTION));
-        Expect.equals('websocket', request.headers.value(HttpHeaders.UPGRADE));
+        Expect.equals(
+            'Upgrade', request.headers.value(HttpHeaders.connectionHeader));
+        Expect.equals(
+            'websocket', request.headers.value(HttpHeaders.upgradeHeader));
 
         var key = request.headers.value('Sec-WebSocket-Key');
         var digest = sha1.convert("$key$WEB_SOCKET_GUID".codeUnits);
         var accept = base64.encode(digest.bytes);
         request.response
-          ..statusCode = HttpStatus.SWITCHING_PROTOCOLS
-          ..headers.add(HttpHeaders.CONNECTION, "Upgrade")
-          ..headers.add(HttpHeaders.UPGRADE, "websocket")
+          ..statusCode = HttpStatus.switchingProtocols
+          ..headers.add(HttpHeaders.connectionHeader, "Upgrade")
+          ..headers.add(HttpHeaders.upgradeHeader, "websocket")
           ..headers.add("Sec-WebSocket-Accept", accept)
           ..headers.add(
               "Sec-WebSocket-Extensions",
@@ -207,7 +209,8 @@
   }
 
   void testReturnHeaders(String headerValue, String expected,
-      {CompressionOptions serverCompression: CompressionOptions.DEFAULT}) {
+      {CompressionOptions serverCompression:
+          CompressionOptions.compressionDefault}) {
     asyncStart();
     createServer().then((server) {
       server.listen((request) {
@@ -227,7 +230,7 @@
 
       var url = '${secure ? "wss" : "ws"}://$HOST_NAME:${server.port}/';
       createWebsocket(url, headerValue).then((HttpClientResponse response) {
-        Expect.equals(response.statusCode, HttpStatus.SWITCHING_PROTOCOLS);
+        Expect.equals(response.statusCode, HttpStatus.switchingProtocols);
         print(response.headers.value('Sec-WebSocket-Extensions'));
         Expect.equals(
             response.headers.value("Sec-WebSocket-Extensions"), expected);
@@ -361,7 +364,7 @@
         'permessage-deflate; client_max_window_bits=15',
         serverCompression: compression);
 
-    compression = CompressionOptions.DEFAULT;
+    compression = CompressionOptions.compressionDefault;
     testClientRequestHeaders(compression);
     compression = new CompressionOptions(
         clientNoContextTakeover: true, serverNoContextTakeover: true);
diff --git a/tests/standalone_2/io/web_socket_error_test.dart b/tests/standalone_2/io/web_socket_error_test.dart
index 41c40e0..c757688 100644
--- a/tests/standalone_2/io/web_socket_error_test.dart
+++ b/tests/standalone_2/io/web_socket_error_test.dart
@@ -56,9 +56,9 @@
     createServer().then((server) {
       server.listen((request) {
         var response = request.response;
-        response.statusCode = HttpStatus.SWITCHING_PROTOCOLS;
-        response.headers.set(HttpHeaders.CONNECTION, "upgrade");
-        response.headers.set(HttpHeaders.UPGRADE, "websocket");
+        response.statusCode = HttpStatus.switchingProtocols;
+        response.headers.set(HttpHeaders.connectionHeader, "upgrade");
+        response.headers.set(HttpHeaders.upgradeHeader, "websocket");
         String key = request.headers.value("Sec-WebSocket-Key");
         _SHA1 sha1 = new _SHA1();
         sha1.add("$key$webSocketGUID".codeUnits);
diff --git a/tests/standalone_2/io/web_socket_ping_test.dart b/tests/standalone_2/io/web_socket_ping_test.dart
index 43fc680..1ee03b5 100644
--- a/tests/standalone_2/io/web_socket_ping_test.dart
+++ b/tests/standalone_2/io/web_socket_ping_test.dart
@@ -24,9 +24,9 @@
     int closed = 0;
     server.listen((request) {
       var response = request.response;
-      response.statusCode = HttpStatus.SWITCHING_PROTOCOLS;
-      response.headers.set(HttpHeaders.CONNECTION, "upgrade");
-      response.headers.set(HttpHeaders.UPGRADE, "websocket");
+      response.statusCode = HttpStatus.switchingProtocols;
+      response.headers.set(HttpHeaders.connectionHeader, "upgrade");
+      response.headers.set(HttpHeaders.upgradeHeader, "websocket");
       String key = request.headers.value("Sec-WebSocket-Key");
       _SHA1 sha1 = new _SHA1();
       sha1.add("$key$webSocketGUID".codeUnits);
diff --git a/tests/standalone_2/io/web_socket_test.dart b/tests/standalone_2/io/web_socket_test.dart
index c65434f..11cd47f 100644
--- a/tests/standalone_2/io/web_socket_test.dart
+++ b/tests/standalone_2/io/web_socket_test.dart
@@ -50,7 +50,7 @@
 
   checkCloseStatus(webSocket, closeStatus, closeReason) {
     Expect.equals(
-        closeStatus == null ? WebSocketStatus.NO_STATUS_RECEIVED : closeStatus,
+        closeStatus == null ? WebSocketStatus.noStatusReceived : closeStatus,
         webSocket.closeCode);
     Expect.equals(
         closeReason == null ? "" : closeReason, webSocket.closeReason);
@@ -283,9 +283,9 @@
 
   void testNoUpgrade() {
     createServer().then((server) {
-      // Create a server which always responds with NOT_FOUND.
+      // Create a server which always responds with notFound.
       server.listen((request) {
-        request.response.statusCode = HttpStatus.NOT_FOUND;
+        request.response.statusCode = HttpStatus.notFound;
         request.response.close();
       });
 
@@ -310,7 +310,7 @@
               "${secure ? 'https:' : 'http:'}//$HOST_NAME:${server.port}/"))
           .then((request) => request.close())
           .then((response) {
-        Expect.equals(HttpStatus.BAD_REQUEST, response.statusCode);
+        Expect.equals(HttpStatus.badRequest, response.statusCode);
         client.close();
         server.close();
       });
@@ -352,12 +352,12 @@
           Expect.equals(0, onmessageCalled);
           Expect.isFalse(oncloseCalled);
           onopenCalled = true;
-          Expect.equals(WebSocket.OPEN, webSocket.readyState);
+          Expect.equals(WebSocket.open, webSocket.readyState);
           webSocket.listen((message) {
             onmessageCalled++;
             Expect.isTrue(onopenCalled);
             Expect.isFalse(oncloseCalled);
-            Expect.equals(WebSocket.OPEN, webSocket.readyState);
+            Expect.equals(WebSocket.open, webSocket.readyState);
             webSocket.add(message);
           }, onDone: () {
             Expect.isTrue(onopenCalled);
@@ -366,7 +366,7 @@
             oncloseCalled = true;
             Expect.equals(3002, webSocket.closeCode);
             Expect.equals("Got tired", webSocket.closeReason);
-            Expect.equals(WebSocket.CLOSED, webSocket.readyState);
+            Expect.equals(WebSocket.closed, webSocket.readyState);
           });
         });
       }
@@ -390,7 +390,7 @@
           });
         } else {
           Expect.isFalse(WebSocketTransformer.isUpgradeRequest(request));
-          request.response.statusCode = HttpStatus.OK;
+          request.response.statusCode = HttpStatus.ok;
           request.response.close();
         }
       });
@@ -417,7 +417,7 @@
             .then((request) => request.close())
             .then((response) {
           response.listen((_) {});
-          Expect.equals(HttpStatus.OK, response.statusCode);
+          Expect.equals(HttpStatus.ok, response.statusCode);
         }));
       }
 
@@ -433,16 +433,18 @@
     asyncStart();
     createServer().then((server) {
       server.listen((request) {
-        Expect.equals('Upgrade', request.headers.value(HttpHeaders.CONNECTION));
-        Expect.equals('websocket', request.headers.value(HttpHeaders.UPGRADE));
+        Expect.equals(
+            'Upgrade', request.headers.value(HttpHeaders.connectionHeader));
+        Expect.equals(
+            'websocket', request.headers.value(HttpHeaders.upgradeHeader));
 
         var key = request.headers.value('Sec-WebSocket-Key');
         var digest = sha1.convert("$key$WEB_SOCKET_GUID".codeUnits);
         var accept = base64.encode(digest.bytes);
         request.response
-          ..statusCode = HttpStatus.SWITCHING_PROTOCOLS
-          ..headers.add(HttpHeaders.CONNECTION, "Upgrade")
-          ..headers.add(HttpHeaders.UPGRADE, "websocket")
+          ..statusCode = HttpStatus.switchingProtocols
+          ..headers.add(HttpHeaders.connectionHeader, "Upgrade")
+          ..headers.add(HttpHeaders.upgradeHeader, "websocket")
           ..headers.add("Sec-WebSocket-Accept", accept);
         request.response.contentLength = 0;
         request.response.detachSocket().then((socket) {
diff --git a/tests/standalone_2/io/web_socket_typed_data_test.dart b/tests/standalone_2/io/web_socket_typed_data_test.dart
index 59939e2..595ca60 100644
--- a/tests/standalone_2/io/web_socket_typed_data_test.dart
+++ b/tests/standalone_2/io/web_socket_typed_data_test.dart
@@ -18,14 +18,15 @@
 Future<WebSocket> createClient(int port, bool compression) => compression
     ? WebSocket.connect('ws://127.0.0.1:$port/')
     : WebSocket.connect('ws://127.0.0.1:$port/',
-        compression: CompressionOptions.OFF);
+        compression: CompressionOptions.compressionOff);
 
 void test(expected, testData, compression) {
   createServer().then((server) {
     var messageCount = 0;
     var transformer = compression
         ? new WebSocketTransformer()
-        : new WebSocketTransformer(compression: CompressionOptions.OFF);
+        : new WebSocketTransformer(
+            compression: CompressionOptions.compressionOff);
     server.transform(transformer).listen((webSocket) {
       webSocket.listen((message) {
         Expect.listEquals(expected, message);
@@ -76,7 +77,8 @@
     var messageCount = 0;
     var transformer = compression
         ? new WebSocketTransformer()
-        : new WebSocketTransformer(compression: CompressionOptions.OFF);
+        : new WebSocketTransformer(
+            compression: CompressionOptions.compressionOff);
     server.transform(transformer).listen((webSocket) {
       webSocket.listen((message) => Expect.fail("No message expected"));
     });
@@ -180,7 +182,8 @@
     var messageCount = 0;
     var transformer = compression
         ? new WebSocketTransformer()
-        : new WebSocketTransformer(compression: CompressionOptions.OFF);
+        : new WebSocketTransformer(
+            compression: CompressionOptions.compressionOff);
     server.transform(transformer).listen((webSocket) {
       webSocket.listen((message) {
         messageCount++;
diff --git a/tests/standalone_2/map_insert_remove_oom_test.dart b/tests/standalone_2/map_insert_remove_oom_test.dart
index f20126a..143fd18 100644
--- a/tests/standalone_2/map_insert_remove_oom_test.dart
+++ b/tests/standalone_2/map_insert_remove_oom_test.dart
@@ -2,9 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--old_gen_heap_size=11
+// VMOptions=--old_gen_heap_size=12
 //
-// Notice we set the old gen heap size to 11 MB, which seems to be the minimum
+// Notice we set the old gen heap size to 12 MB, which seems to be the minimum
 // (in debug mode) to not cause us run OOM during isolate initialization.  The
 // problem here is that we pre-allocate certain exceptions, e.g. NullThrownError
 // during isolate initialization, but if we have an allocation failure before
diff --git a/tests/standalone_2/packages_file_test.dart b/tests/standalone_2/packages_file_test.dart
index e213110..cc48568 100644
--- a/tests/standalone_2/packages_file_test.dart
+++ b/tests/standalone_2/packages_file_test.dart
@@ -833,7 +833,7 @@
 /// The file contents are run through [fixPaths] to allow them to be self-
 /// referential.
 Future<HttpServer> startServer(Map files) async {
-  return (await HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, 0))
+  return (await HttpServer.bind(InternetAddress.loopbackIPv4, 0))
     ..forEach((request) {
       var result = files;
       onFailure:
@@ -856,7 +856,7 @@
         }
       }
       request.response
-        ..statusCode = HttpStatus.NOT_FOUND
+        ..statusCode = HttpStatus.notFound
         ..close();
     });
 }
diff --git a/tests/standalone_2/standalone_2.status b/tests/standalone_2/standalone_2.status
index 90a5707..57e4fee 100644
--- a/tests/standalone_2/standalone_2.status
+++ b/tests/standalone_2/standalone_2.status
@@ -102,7 +102,6 @@
 io/socket_many_connections_test: Skip # This test fails with "Too many open files" on the Mac OS buildbot. This is expected as MacOS by default runs with a very low number of allowed open files ('ulimit -n' says something like 256).
 
 [ $strong && ($compiler == dartk || $compiler == dartkp) ]
-io/dependency_graph_test: CompileTimeError
 io/directory_test: RuntimeError
 io/file_error_test: RuntimeError
 io/file_test: RuntimeError
@@ -116,10 +115,7 @@
 io/http_server_response_test: RuntimeError
 io/regress_10026_test: RuntimeError
 io/secure_socket_argument_test: CompileTimeError
-io/skipping_dart2js_compilations_test: CompileTimeError
 io/socket_upgrade_to_secure_test: RuntimeError
-io/test_harness_analyzer_test: CompileTimeError
-io/test_runner_test: CompileTimeError
 io/web_socket_pipe_test: RuntimeError
 io/web_socket_protocol_processor_test: CompileTimeError
 io/zlib_test: RuntimeError
diff --git a/tests/standalone_2/standalone_2_kernel.status b/tests/standalone_2/standalone_2_kernel.status
index caa9d9b..f3d8db5 100644
--- a/tests/standalone_2/standalone_2_kernel.status
+++ b/tests/standalone_2/standalone_2_kernel.status
@@ -11,7 +11,6 @@
 # to add them.
 
 [ $compiler == app_jitk ]
-io/dependency_graph_test: CompileTimeError
 io/directory_test: RuntimeError
 io/file_error_test: RuntimeError
 io/file_test: RuntimeError
@@ -34,12 +33,10 @@
 io/platform_test: RuntimeError
 io/regress_10026_test: RuntimeError
 io/secure_socket_argument_test: CompileTimeError
-io/skipping_dart2js_compilations_test: CompileTimeError
 io/socket_upgrade_to_secure_test: RuntimeError
 io/test_extension_fail_test: RuntimeError
 io/test_extension_test: RuntimeError
-io/test_harness_analyzer_test: CompileTimeError
-io/test_runner_test: CompileTimeError
+io/test_runner_test: RuntimeError
 io/web_socket_pipe_test: RuntimeError
 io/web_socket_protocol_processor_test: CompileTimeError
 io/zlib_test: RuntimeError
@@ -201,14 +198,10 @@
 *: SkipByDesign
 
 [ $compiler == fasta && $strong ]
-io/dependency_graph_test: CompileTimeError
 io/http_cookie_date_test: CompileTimeError
 io/http_headers_test: CompileTimeError
 io/http_parser_test: CompileTimeError
 io/secure_socket_argument_test: CompileTimeError
-io/skipping_dart2js_compilations_test: CompileTimeError
-io/test_harness_analyzer_test: CompileTimeError
-io/test_runner_test: CompileTimeError
 io/web_socket_protocol_processor_test: CompileTimeError
 
 [ $fasta && !$strong ]
diff --git a/tools/VERSION b/tools/VERSION
index 0f5e991..9fbb187 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 0
 PATCH 0
-PRERELEASE 60
+PRERELEASE 61
 PRERELEASE_PATCH 0
diff --git a/tools/apps/update_homebrew/lib/update_homebrew.dart b/tools/apps/update_homebrew/lib/update_homebrew.dart
index 0d2fcbb..3db0e68 100644
--- a/tools/apps/update_homebrew/lib/update_homebrew.dart
+++ b/tools/apps/update_homebrew/lib/update_homebrew.dart
@@ -23,6 +23,7 @@
 const contentShellFile = 'dartium/content_shell-macos-x64-release.zip';
 
 const dartRbFileName = 'dart.rb';
+const dart2RbFileName = 'dart@2.rb';
 
 Future<String> getHash256(
     String channel, String revision, String download) async {
@@ -107,6 +108,9 @@
   await new File(p.join(repository, dartRbFileName)).writeAsString(
       createDartFormula(revisions, hashes, devVersion, stableVersion),
       flush: true);
+  await new File(p.join(repository, dart2RbFileName)).writeAsString(
+      createDart2Formula(revisions, hashes, devVersion, stableVersion),
+      flush: true);
 }
 
 String createDartFormula(
@@ -200,6 +204,61 @@
 end
 ''';
 
+/// TODO: Remove this formula after Dart 2 is released as stable.
+/// This is a transitional mechanism to support developers migrating
+/// from Dart 1 to Dart 2 while it's in pre-release.
+String createDart2Formula(
+        Map revisions, Map hashes, String devVersion, String stableVersion) =>
+    '''
+class DartAT2 < Formula
+  desc "The Dart 2 SDK"
+  homepage "https://www.dartlang.org/"
+  version "$devVersion"
+
+  keg_only :versioned_formula
+
+  if MacOS.prefer_64_bit?
+    url "$urlBase/dev/release/${revisions['dev']}/$x64File"
+    sha256 "${hashes['dev'][x64File]}"
+  else
+    url "$urlBase/dev/release/${revisions['dev']}/$ia32File"
+    sha256 "${hashes['dev'][ia32File]}"
+  end
+
+  def install
+    libexec.install Dir["*"]
+    bin.install_symlink "#{libexec}/bin/dart"
+    bin.write_exec_script Dir["#{libexec}/bin/{pub,dart?*}"]
+  end
+
+  def shim_script(target)
+    <<~EOS
+      #!/usr/bin/env bash
+      exec "#{prefix}/#{target}" "$@"
+    EOS
+  end
+
+  def caveats; <<~EOS
+    Note that this is a prerelease version of Dart.
+
+    Please note the path to the Dart SDK:
+      #{opt_libexec}
+    EOS
+  end
+
+  test do
+    (testpath/"sample.dart").write <<~EOS
+      void main() {
+        print(r"test message");
+      }
+    EOS
+
+    assert_equal "test message\n", shell_output("#{bin}/dart sample.dart")
+  end
+end
+''';
+
+
 Future runGit(List<String> args, String repository,
     Map<String, String> gitEnvironment) async {
   print("git ${args.join(' ')}");
diff --git a/tools/bots/README.md b/tools/bots/README.md
new file mode 100644
index 0000000..c430c6d
--- /dev/null
+++ b/tools/bots/README.md
@@ -0,0 +1,124 @@
+# tools/bots
+This folder contains scripts and configuration files used by Dart's continuous
+integration and testing infrastructure.
+
+## Test matrix
+The file `test_matrix.json` defines the test configurations run by Dart's CI
+infrastructure. Changes to the test matrix affect all builds that include them.
+
+### Structure
+The test matrix is a JSON document and consists of the `"filesets"` object and
+the `"configurations"` array.
+
+The file sets define files and/or directories that need to be present for a test
+configuration at runtime. Any directory specified will be included along with
+its subdirectories recursively. Directory names must have a `/` at the end. All
+paths are relative to the SDK checkout's root directory.
+
+```json
+"filesets": {
+  "a_fileset_name": [
+    "a/directory/",
+    "a/file"
+  ],
+  "another_fileset_name": [
+    "another/directory/",
+    "another/file"
+  ]
+}
+```
+
+The builder configurations describe all test configurations a specific builder
+must execute. Each builder configuration is an object that specifies which
+builders it applies to, defines the build steps for the builders, and some
+additional metadata. Only one builder configuration can apply to a builder.
+
+```json
+"configurations": [
+  {
+    "builders": [
+      "a-builder",
+      "another-builder"
+    ],
+    "meta": {
+      "description": "Description of this configuration."
+    },
+    "steps": [
+    ]
+  }
+]
+```
+
+Each step is an object and must have a name. A step may also specify a script to
+run instead of the default script: `tools/test.py`. Additional arguments may be
+specified. These arguments will be passed to the script.
+
+```json
+"steps": [
+  {
+    "name": "build it",
+    "script": "tools/build.py",
+    "arguments": ["--a-flag", "target", "another_target"]
+  },
+  {
+    "name": "test it",
+  }
+]
+```
+
+A step using the default script may also be sharded across many machines using
+the `"shards"` parameter. If a step is sharded, it must specify a `"fileset"`.
+Only the files and directories defined by the file set will be available to the
+script when it's running on a shard.
+
+```json
+{
+  "name": "shard the tests",
+  "shards": 10,
+  "fileset": "a_fileset_name"
+}
+```
+
+### Builder name parsing
+The builder names are split by '-' and each part is then examined if it is an
+option. Options can be runtimes (e.g. "chrome"), architectures (e.g. x64) and
+operating system families (e.g. win). For each valid option, additional
+arguments are passed to the `tools/test.py` and `tools/build.py` scripts.
+
+### Adding a new builder
+To add a builder:
+
+1. Decide on a name.
+2. Add the builder name to a new or existing configuration.
+3. File an issue labelled "area-infrastructure" to get your builder activated.
+
+### Testing a new or modified builder
+Builders can be tested using a tool called `led` that is included in
+depot_tools. Replace buildername and CL number with the correct values and run:
+
+```bash
+led get-builder luci.dart.ci:<builder name> | \
+led edit-cr-cl 'https://dart-review.googlesource.com/c/<cl number>' | \
+led launch
+```
+
+### Adding a builder to the commit queue
+For now, file an issue labeled "area-infrastructure" to get your builder added
+to the commit queue.
+
+## Glossary
+
+### Builder
+A builder has a name and defines the steps the need to be run when it is
+executed by a bot. In general, a builder defines how to build and test software.
+
+### Bot
+A physical or virtual machine (or even a docker container) that executes all
+commands it receives. Often, these commands are the steps defined by a builder.
+
+### Sharding
+Sharded steps copy all files in a file set to as many bots as specified and
+runs the same command on all of the shards. Each shard has a shard number. The
+shard number and the total number of shards are passed as arguments to the
+command. The command is then responsible for running a subset of its work on
+each shard based on these arguments.
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 6302dd7..0ed7709 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -174,10 +174,30 @@
     },
     {
       "builders": [
+        "vm-linux-product-x64",
+        "vm-mac-product-x64",
+        "vm-win-product-x64"
+      ],
+      "meta": {
+        "description": "This configuration is used by the vm product builders."
+      },
+      "steps": [
+        {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": ["runtime"]
+        },
+        {
+          "name": "vm tests",
+          "arguments": ["--builder-tag=swarming"]
+        }
+      ]
+    },
+    {
+      "builders": [
         "vm-linux-debug-ia32",
         "vm-linux-debug-simarm",
         "vm-linux-debug-x64",
-        "vm-linux-product-x64",
         "vm-linux-release-ia32",
         "vm-linux-release-simarm",
         "vm-linux-release-simarm64",
@@ -185,18 +205,16 @@
         "vm-mac-debug-ia32",
         "vm-mac-debug-simdbc64",
         "vm-mac-debug-x64",
-        "vm-mac-product-x64",
         "vm-mac-release-ia32",
         "vm-mac-release-simdbc64",
         "vm-mac-release-x64",
         "vm-win-debug-ia32",
         "vm-win-debug-x64",
-        "vm-win-product-x64",
         "vm-win-release-ia32",
         "vm-win-release-x64"
       ],
       "meta": {
-        "description": "This configuration is used by the vm debug, vm product and vm release builders."
+        "description": "This configuration is used by the vm debug and vm release builders."
       },
       "steps": [
         {
@@ -1220,7 +1238,7 @@
       ]
     },
     {
-      "builders": ["dart2js-csp-minified-linux-x64-drt"],
+      "builders": ["dart2js-csp-minified-linux-x64-chrome"],
       "meta": {
         "description": "This builder runs the dart2js tests in csp and minified mode."
       },
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 036b320..324900c 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -1293,12 +1293,12 @@
       promiseCall = 'promiseToFuture'
       if promiseFound is not(None):
         if 'maplike' in promiseFound:
-          promiseCall = 'promiseToFutureMap'
+          promiseCall = 'promiseToFuture<dynamic>'
           promiseType = 'Future'
         elif promiseFound['type'] == 'dictionary':
           # It's a dictionary so return as a Map.
-          promiseCall = 'promiseToFutureDictionary'
-          promiseType = 'Future<Map>'
+          promiseCall = 'promiseToFutureAsMap'
+          promiseType = 'Future<Map<String, dynamic>>'
         else:
           paramType = promiseFound['type']
           promiseCall = 'promiseToFuture<%s>' % paramType
diff --git a/tools/dom/src/dart2js_CssClassSet.dart b/tools/dom/src/dart2js_CssClassSet.dart
index 244e34c..c3394aa 100644
--- a/tools/dom/src/dart2js_CssClassSet.dart
+++ b/tools/dom/src/dart2js_CssClassSet.dart
@@ -15,8 +15,8 @@
   final List<CssClassSetImpl> _sets;
 
   factory _MultiElementCssClassSet(Iterable<Element> elements) {
-    return new _MultiElementCssClassSet._(
-        elements, elements.map((Element e) => e.classes).toList());
+    return new _MultiElementCssClassSet._(elements,
+        new List<CssClassSetImpl>.from(elements.map((Element e) => e.classes)));
   }
 
   _MultiElementCssClassSet._(this._elementIterable, this._sets);
diff --git a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
index 2f5c1e9..d989b1d 100644
--- a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
@@ -122,39 +122,28 @@
     JS('returns:HtmlDocument;depends:none;effects:none;gvn:true', 'document');
 
 // Supoort to convert JS Promise to a Dart Future.
-Future<T> promiseToFuture<T>(thePromise) {
+Future<T> promiseToFuture<T>(jsPromise) {
   var completer = new Completer<T>();
 
   var thenSuccessCode = (promiseValue) => completer.complete(promiseValue);
   var thenErrorCode = (promiseError) => completer.completeError(promiseError);
 
-  JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1), convertDartClosureToJS(thenErrorCode, 1));
-
-  return completer.future;
-}
-
-// Supoort to convert JS Promise to a Dart Future that returns a MapLike (Class with Map mixin).
-Future promiseToFutureMap(thePromise) {
-  var completer = new Completer();
-
-  var thenSuccessCode = (promiseValue) => completer.complete(promiseValue);
-  var thenErrorCode = (promiseError) => completer.completeError(promiseError);
-
-  JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1),
+  JS("", "#.then(#, #)", jsPromise, convertDartClosureToJS(thenSuccessCode, 1),
       convertDartClosureToJS(thenErrorCode, 1));
 
   return completer.future;
 }
 
-// Supoort to convert JS Promise to a Dart Future that returns a Dictionary as a Dart Map.
-Future<Map> promiseToFutureDictionary(thePromise) {
-  var completer = new Completer<Map>();
+// Supoort to convert JS Promise to a Dart Future<Map<String, dynamic>>.  Each property of the JS
+// object is added to the Map as a key of type String with a value of type dynamic.
+Future<Map<String, dynamic>> promiseToFutureAsMap(jsPromise) {
+  var completer = new Completer<Map<String, dynamic>>();
 
   var thenSuccessCode = (promiseValue) =>
       completer.complete(convertNativeToDart_Dictionary(promiseValue));
   var thenErrorCode = (promiseError) => completer.completeError(promiseError);
 
-  JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1),
+  JS("", "#.then(#, #)", jsPromise, convertDartClosureToJS(thenSuccessCode, 1),
       convertDartClosureToJS(thenErrorCode, 1));
 
   return completer.future;
diff --git a/tools/gardening/bin/results_get.dart b/tools/gardening/bin/results_get.dart
index 73b8bb9..9dccea4 100644
--- a/tools/gardening/bin/results_get.dart
+++ b/tools/gardening/bin/results_get.dart
@@ -129,7 +129,7 @@
         statusExpectations.getTestResultsWithExpectation();
 
     var outputTable = getOutputTable(argResults)
-      ..addHeader(new Column("Test", width: 38), (TestExpectationResult item) {
+      ..addHeader(new Column("Test", width: 38), (item) {
         return item.result.name;
       })
       ..addHeader(new Column("Result", width: 18), (item) {
diff --git a/tools/gardening/lib/src/buildbucket.dart b/tools/gardening/lib/src/buildbucket.dart
index ff4db96..681df1d 100644
--- a/tools/gardening/lib/src/buildbucket.dart
+++ b/tools/gardening/lib/src/buildbucket.dart
@@ -51,11 +51,11 @@
   });
 }
 
-List<BuildBucketBuild> _buildsFromJson(Map json) {
+List<BuildBucketBuild> _buildsFromJson(dynamic json) {
   if (json == null || !json.containsKey("builds")) {
     return null;
   }
-  return json["builds"].map((build) {
+  return json["builds"].map<BuildBucketBuild>((build) {
     var tags = build["tags"];
     return new BuildBucketBuild(
         build["id"],
diff --git a/tools/gardening/lib/src/logdog_rpc.dart b/tools/gardening/lib/src/logdog_rpc.dart
index 32f1499..f38ab09 100644
--- a/tools/gardening/lib/src/logdog_rpc.dart
+++ b/tools/gardening/lib/src/logdog_rpc.dart
@@ -52,7 +52,7 @@
         return <LogdogStream>[];
       }
       return json["streams"]
-          .map((stream) => new LogdogStream(stream["path"]))
+          .map<LogdogStream>((stream) => new LogdogStream(stream["path"]))
           .toList();
     });
   }
diff --git a/tools/gardening/lib/src/logger.dart b/tools/gardening/lib/src/logger.dart
index 8bf1941..4fa5d25 100644
--- a/tools/gardening/lib/src/logger.dart
+++ b/tools/gardening/lib/src/logger.dart
@@ -22,8 +22,8 @@
 
 String _formatMessage(String msg, error, [StackTrace stackTrace]) {
   if (error == null) return msg;
-  if (stackTrace == null) return msg + ": $error";
-  return msg + ": $error\n$stackTrace";
+  if (stackTrace == null) return "$msg: $error";
+  return "$msg: $error\n$stackTrace";
 }
 
 class StdOutLogger extends Logger {
diff --git a/tools/gardening/lib/src/results/result_json_models.dart b/tools/gardening/lib/src/results/result_json_models.dart
index 9f96d48..1e3a0da 100644
--- a/tools/gardening/lib/src/results/result_json_models.dart
+++ b/tools/gardening/lib/src/results/result_json_models.dart
@@ -69,7 +69,7 @@
         json["csp"],
         json["fasta"],
         json["system"],
-        json["vm_options"],
+        json["vm_options"].cast<String>(),
         json["use_sdk"],
         json["builder_tag"],
         json["fast_startup"],
@@ -80,7 +80,7 @@
         json["hot_reload"] ?? false,
         json["hot_reload_rollback"] ?? false,
         json["preview_dart_2"] ?? false,
-        json["selectors"] ?? []);
+        json["selectors"].cast<String>() ?? <String>[]);
   }
 
   /// Returns the arguments needed for running test.py with the arguments
@@ -157,8 +157,9 @@
       this.testExpectations, this.commands);
 
   static Result getFromJson(dynamic json) {
-    var commands = json["commands"].map((x) => Command.getFromJson(x)).toList();
-    var testExpectations = json["test_expectation"];
+    var commands =
+        json["commands"].map<Command>((x) => Command.getFromJson(x)).toList();
+    var testExpectations = json["test_expectation"].cast<String>();
     return new Result(json["configuration"], json["name"], json["result"],
         json["flaky"], json["negative"], testExpectations, commands);
   }
@@ -205,8 +206,10 @@
 
   List<Result> _results;
   List<Result> get results {
-    return _results ??=
-        this.jsonObject["results"].map((x) => Result.getFromJson(x)).toList();
+    return _results ??= this
+        .jsonObject["results"]
+        .map<Result>((x) => Result.getFromJson(x))
+        .toList();
   }
 
   /// Combines multiple test-results into a single test-result, potentially by
diff --git a/tools/gardening/lib/src/results/test_result_helper.dart b/tools/gardening/lib/src/results/test_result_helper.dart
index b394289..7304fed 100644
--- a/tools/gardening/lib/src/results/test_result_helper.dart
+++ b/tools/gardening/lib/src/results/test_result_helper.dart
@@ -88,7 +88,7 @@
   if (arguments.length == 1) {
     if (!isSwarmingTaskUrl(firstArgument)) {
       print("URI does not match "
-          "`https://ci.chromium.org/swarming/task/<taskid>?server...`.");
+          "`https://<hostname>/swarming/task/<taskid>`.");
       return null;
     }
     String swarmingTaskId = getSwarmingTaskId(firstArgument);
diff --git a/tools/gardening/lib/src/util.dart b/tools/gardening/lib/src/util.dart
index 48c3848..4dd25e0 100644
--- a/tools/gardening/lib/src/util.dart
+++ b/tools/gardening/lib/src/util.dart
@@ -305,13 +305,14 @@
 
 /// Gets if the [url] is a swarming task url.
 bool isSwarmingTaskUrl(String url) {
-  return url.startsWith("https://ci.chromium.org/swarming");
+  return url.startsWith(new RegExp(r"https:\/\/.*\/swarming\/task\/"));
 }
 
 /// Gets the swarming task id from the [url].
 String getSwarmingTaskId(String url) {
   RegExp swarmingTaskIdInPathRegExp =
-      new RegExp(r"https:\/\/ci\.chromium\.org\/swarming\/task\/(.*)\?server");
+      new RegExp(r"https:\/\/.*\/swarming\/task\/(.*)");
+  url = url?.split("?")[0];
   Match swarmingTaskIdMatch = swarmingTaskIdInPathRegExp.firstMatch(url);
   if (swarmingTaskIdMatch == null) {
     return null;
diff --git a/tools/gardening/pubspec.yaml b/tools/gardening/pubspec.yaml
index 2b6c4e1..ca78789 100644
--- a/tools/gardening/pubspec.yaml
+++ b/tools/gardening/pubspec.yaml
@@ -4,7 +4,7 @@
 #version: do-not-upload
 dependencies:
   args:
-  http: 0.11.3+14
+  http:
   path:
   status_file:
     path: ../../pkg/status_file/
diff --git a/tools/migration/bin/run_tests.dart b/tools/migration/bin/run_tests.dart
index 3fc8498..9fbf645 100644
--- a/tools/migration/bin/run_tests.dart
+++ b/tools/migration/bin/run_tests.dart
@@ -38,6 +38,7 @@
 const releaseMode = "--mode=release";
 const productMode = "--mode=product";
 const strong = "--strong";
+const previewDart2 = "--preview-dart-2";
 
 /// Maps configuration names to a corresponding set of test.dart command line
 /// arguments.
@@ -75,6 +76,7 @@
   ],
   "dart2js-jsshell": [dart2js, jsshell, fastStartup, useSdk, dart2jsBatch],
   // TODO(rnystrom): Is it worth running dart2js on Firefox too?
+  "dart2js-2": [dart2js, chrome, dart2jsBatch, previewDart2],
   "dartdevc": [dartdevc, chrome, useSdk, strong],
   "dartdevc-kernel": [dartdevk, chrome, checked, useSdk, strong],
   "dartdevc-kernel-noruntime": [dartdevk, noRuntime, checked, useSdk, strong],
diff --git a/tools/patch_sdk.dart b/tools/patch_sdk.dart
index 411442c..e32065c 100644
--- a/tools/patch_sdk.dart
+++ b/tools/patch_sdk.dart
@@ -539,7 +539,6 @@
   'ImmutableArray',
   'OneByteString',
   'TwoByteString',
-  'Bigint'
 ].map((name) => "static final int cid${name} = 0;").join('\n');
 
 /// Merge `@patch` declarations into `external` declarations.
diff --git a/tools/testing/dart/browser_test.dart b/tools/testing/dart/browser_test.dart
index 4c2d536..1cf0526 100644
--- a/tools/testing/dart/browser_test.dart
+++ b/tools/testing/dart/browser_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'utils.dart';
+import 'configuration.dart' show Compiler;
 
 String dart2jsHtml(String title, String scriptPath) {
   return """
@@ -40,10 +41,12 @@
 /// The [testName] is the short name of the test without any subdirectory path
 /// or extension, like "math_test". The [testJSDir] is the relative path to the
 /// build directory where the dartdevc-generated JS file is stored.
-String dartdevcHtml(String testName, String testJSDir, String buildDir) {
+String dartdevcHtml(String testName, String testJSDir, Compiler compiler) {
+  var isKernel = compiler == Compiler.dartdevk;
+  var sdkPath = isKernel ? 'kernel/amd/dart_sdk' : 'js/amd/dart_sdk';
+  var pkgDir = isKernel ? 'pkg_kernel' : 'pkg';
   var packagePaths = testPackages
-      .map((package) => '    "$package": "/root_dart/$buildDir/gen/utils/'
-          'dartdevc/pkg/$package",')
+      .map((p) => '    "$p": "/root_build/gen/utils/dartdevc/$pkgDir/$p",')
       .join("\n");
 
   return """
@@ -69,7 +72,7 @@
 var require = {
   baseUrl: "/root_dart/$testJSDir",
   paths: {
-    "dart_sdk": "/root_build/gen/utils/dartdevc/js/amd/dart_sdk",
+    "dart_sdk": "/root_build/gen/utils/dartdevc/$sdkPath",
 $packagePaths
   },
   waitSeconds: 30,
@@ -86,9 +89,6 @@
 requirejs(["$testName", "dart_sdk", "async_helper"],
     function($testName, sdk, async_helper) {  
   sdk.dart.ignoreWhitelistedErrors(false);
-  // TODO(rnystrom): This uses DDC's forked version of async_helper. Unfork
-  // these packages when possible.
-  async_helper.async_helper.asyncTestInitialize(function() {});
   sdk._isolate_helper.startRootIsolate(function() {}, []);
   sdk._debugger.registerDevtoolsFormatter();
 
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index 9661adc..15ac03d 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -605,13 +605,14 @@
         .toNativePath();
 
     var summaryInputDir = new Path(_configuration.buildDirectory)
-        .append("/gen/utils/dartdevc/pkg")
+        .append("/gen/utils/dartdevc/pkg_kernel")
         .absolute
         .toNativePath();
 
     args.addAll([
       "--dart-sdk-summary",
       sdkSummary,
+      "--no-summarize",
       "-o",
       outputFile,
       inputFile,
@@ -622,7 +623,7 @@
     // get recompiled into the test's own module.
     for (var package in testPackages) {
       var summary = new Path(_configuration.buildDirectory)
-          .append("/gen/utils/dartdevc/pkg/$package.dill")
+          .append("/gen/utils/dartdevc/pkg_kernel/$package.dill")
           .absolute
           .toNativePath();
       args.add("-s");
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index d7beed3..4a16a03 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -1061,7 +1061,7 @@
         // Always run with synchronous starts of `async` functions.
         // If we want to make this dependent on other parameters or flags,
         // this flag could be become conditional.
-        content = dartdevcHtml(nameNoExt, jsDir, buildDir);
+        content = dartdevcHtml(nameNoExt, jsDir, configuration.compiler);
       }
     }
 
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index d6fcbaa..abadd8d 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -128,6 +128,7 @@
   # tools/patch_sdk.dart and then change this to use generate_patch_sdk().
   deps = [
     ":dartdevc_files_stamp",
+    ":dartdevc_sdk_patch_stamp",
 
     # The patch script uses several packages, including analyzer, so consider
     # it dirty if any of those change.
@@ -252,6 +253,11 @@
   output = "$target_gen_dir/dartdevc_files.stamp"
 }
 
+create_timestamp_file("dartdevc_sdk_patch_stamp") {
+  path = rebase_path("../../pkg/dev_compiler/tool/input_sdk")
+  output = "$target_gen_dir/dartdevc_sdk_patch_stamp.stamp"
+}
+
 # Compiles the packages used by the tests to JS with dartdevc so that they are
 # available for loading by the tests.
 prebuilt_dart_action("dartdevc_test_pkg") {
@@ -318,6 +324,7 @@
 prebuilt_dart_action("dartdevk_sdk") {
   deps = [
     ":dartdevc_files_stamp",
+    ":dartdevc_sdk_patch_stamp",
   ]
 
   inputs = [