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..60e919d3
--- /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 = [
