diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index 51c3ad8..9237bdc 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -5,7 +5,7 @@
 \usepackage{hyperref}
 \newcommand{\code}[1]{{\sf #1}}
 \title{Dart Programming Language  Specification \\
-{\large Draft Version 0.71}}
+{\large Draft Version 0.8}}
 \author{The Dart Team}
 \begin{document}
 \maketitle
@@ -514,8 +514,18 @@
 
 \ref{variables}: Final variables no longer introduce setters.
 
+\ref{superinterfaces}: Described \cd{@proxy} annotation's effects on typechecking.
+
+\ref{metadata}: Banned use of types as metadata.
+
 \ref{new}: Instantiating subclasses of malbounded types is a dynamic error.
 
+\ref{typeTest}, \ref{typeCast}, \ref{try}: Use of malformed type in casts, type tests and catch clauses is a dynamic error.
+
+\ref{scripts}: Corrected rules for running scripts.
+
+\ref{dynamicTypeSystem}: In checked mode, subtype tests against malbounded types are dynamic errors.
+
 \ref{leastUpperBounds}:  Extended LUBs to all types.
 
 
@@ -2080,7 +2090,7 @@
 
 It is a compile-time error if the interface of a class $C$ is a superinterface of itself.
 
-Let $C$ be a concrete class that does not declare its own \code{noSuchMethod()} method.
+Let $C$ be a concrete class that does not declare its own \code{noSuchMethod()} method and is not annotated with a metadata declaration of the form \cd{@proxy}, where \cd{proxy} is declared in \cd{dart:core}.
 It is a static warning if the implicit interface of  $C$ includes an instance member $m$ of type $F$ and $C$ does not declare or inherit a corresponding instance member $m$ of type $F'$ such that $F' <: F$. 
 
 \commentary{A class does not inherit members from its superinterfaces. However, its implicit interface does.
@@ -2090,6 +2100,8 @@
 \rationale {
 We choose to issue these warnings only for concrete classes; an abstract class might legitimately be designed with the expectation that concrete subclasses will implement part of  the interface.
 We also disable these warnings if a \code{noSuchMethod()} declaration is present. In such cases, the supported interface is going to be implemented via \code{noSuchMethod()} and no actual declarations of the implemented interface's members are needed. This allows proxy classes for specific types to be implemented without provoking type warnings.
+
+In addition, it may be useful to suppress these warnings if \code{noSuchMethod} is inherited, However, this may suppress meaningful warnings and so we choose not to do so by default. Instead, a special annotation is defined in \cd{dart:core} for this purpose.
 }
 
 It is a static warning if the implicit interface of  a class $C$ includes an instance member $m$ of type $F$ and $C$ declares or inherits a corresponding instance member $m$ of type $F'$ if  $F'$ is not a subtype of $F$. 
@@ -2254,14 +2266,6 @@
 
 $q'_i(a_{i1}, \ldots , a_{ik_i}):\SUPER(a_{i1}, \ldots , a_{ik_i});$.
 
-% The types must be given in the copied constructor. It was tempting to elide them; after all, checked mode will catch things in the
-% super call - but this may be a problem for tools. 
-% We  interpret this instead as S includes the generic parameters, so the signature has already substituted them.
-% Default values may not be replicable for optional params due to scoping/privacy.
-% How to describe and implement
-
-%The class $C$ has an implicitly declared nullary generative constructor with no initializer list and no body. 
-
 If the mixin application declares support for interfaces, the resulting class implements those interfaces.
 
 It is a compile-time error if $S$ is a malformed type. It is a compile-time error if $M$ (respectively, any of $M_1, \ldots, M_k$) is a malformed type. It is a compile time error if a well formed mixin cannot be derived from $M$ (respectively, from each of $M_1, \ldots, M_k$). 
@@ -2271,7 +2275,6 @@
 \commentary{
 If, for example, $M$ declares an instance member $im$ whose type is at odds with the type of a member of the same name in $S$, this will result in a static warning just as if we had defined $K$ by means of an ordinary class declaration extending $S$, with a body that included $im$.
 
-%Another implication of this definition is that one cannot apply a mixin to a superclass that does not provide a nullary constructor.
 }
 
 The effect of a class definition of the form \code{\CLASS{} $C$ = $M$; } or the form 
@@ -2409,7 +2412,6 @@
 Metadata consists of a series of annotations, each of which begin with the character @, followed by  a constant expression that starts with an identifier. It is a compile time error if the expression is not one of the following:
 \begin{itemize}
 \item A reference to a compile-time constant variable.
-\item The name of a class.
 \item A call to a constant constructor.
 \end{itemize}
 
@@ -2523,9 +2525,13 @@
 \rationale{It would be tempting to allow string interpolation where the interpolated value is any compile-time constant.  However, this would require running the \code{toString()} method for constant objects, which could contain arbitrary code.}
 \item A literal symbol (\ref{symbols}).
 \item \NULL{} (\ref{null}).
-\item A qualified reference to a static constant variable (\ref{variables}). \commentary {For example, If class C declares a constant static variable v, C.v is a constant. The same is true if C is accessed via a prefix p; p.C.v is a constant.
+\item A qualified reference to a static constant variable (\ref{variables}). 
+\commentary {For example, If class C declares a constant static variable v, C.v is a constant. The same is true if C is accessed via a prefix p; p.C.v is a constant.
 }
-\item An identifier expression that denotes a constant variable, class or a type alias.
+\item An identifier expression that denotes a constant variable. %CHANGE in googledoc
+\item A simple or qualified identifier denoting a class or a type alias. 
+\commentary {For example, if C is a class or typedef C is a constant, and if C is imported with a prefix p,  p.C is a constant.
+}
 \item A constant constructor invocation (\ref{const}).  
 \item A constant list literal (\ref{lists}).
 \item A constant map literal (\ref{maps}).
@@ -2957,8 +2963,7 @@
 \begin{itemize}
 \item
 First, the expressions $e_1 \ldots e_n$ are evaluated in order they appear in the program, yielding objects $o_1 \ldots o_n$.
-\item
-A fresh instance  (\ref{generativeConstructors}) $a$, of size $n$,  whose class implements the built-in class $List<E>$ is allocated. 
+\item A fresh instance  (\ref{generativeConstructors}) $a$, of size $n$,  whose class implements the built-in class $List<E>$ is allocated. 
 \item
 
 The operator \code{[]=} is invoked on $a$ with  first  argument $i$ and second argument
@@ -3023,8 +3028,7 @@
 \begin{itemize}
 \item
 First, the expression $k_i$ is evaluated yielding object $u_i$, the $e_i$ is vaulted yielding object $o_i$, for $i \in 1..n$ in left to right order, yielding objects $u_1, o_1\ldots u_n, o_n$.
-\item 
-A fresh instance (\ref{generativeConstructors}) $m$ whose class implements the built-in class $Map<K, V>$ is allocated. 
+\item  A fresh instance (\ref{generativeConstructors}) $m$ whose class implements the built-in class $Map<K, V>$ is allocated. 
 \item
 The operator \code{[]=} is invoked on $m$ with  first  argument $u_i$ and second argument $o_i,  i \in 1.. n$.
 \item
@@ -3210,9 +3214,6 @@
 
 Otherwise, if $q$ is a generative constructor (\ref{generativeConstructors}), then:
 
-%Let $T_i$ be the type parameters of $R$ (if any) and let $B_i$ be the bound of $T_i, 1 \le i \le l$.
-%In checked mode, it is a dynamic type error if  $V_i$ is not a subtype of  $[V_1,  \ldots, V_l/T_1,  \ldots, T_l]B_i,  i \in 1.. l$.
-
 \commentary{Note that it this point we are assured that the number of actual type arguments match the number of formal type parameters.}
 
 A fresh instance (\ref{generativeConstructors}), $i$,  of class $R$ is allocated. For each instance variable $f$ of $i$,  if the variable declaration of $f$ has an initializer expression $e_f$, then $e_f$ is evaluated to an object $o_f$ and $f$ is bound to $o_f$. Otherwise $f$ is bound to \NULL{}.
@@ -3225,9 +3226,6 @@
 
 Otherwise, $q$ is a factory constructor (\ref{factories}). Then:
 
-%Let $T_i$ be the type parameters of $R$ (if any) and let $B_i$ be the bound of $T_i, 1 \le i \le l$.
-%In checked mode, it is a dynamic type error if  $V_i$ is not a subtype of  $[V_1,  \ldots, V_l/T_1,  \ldots, T_l]B_i, i \in 1.. l$.
-
 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 $[V_1,  \ldots, V_m/T_1,  \ldots, T_m]($\code{\NEW{} $c(a_1, \ldots, a_n, x_{n+1}: a_{n+1}, \ldots, x_{n+k}: a_{n+k}))$}.
 
 Otherwise, the body of $q$ is executed with respect to the bindings that resulted from the evaluation of the argument list and the type parameters (if any) of $q$ bound to the actual type arguments $V_1, \ldots, V_l$ resulting in an object $i$. The result of the evaluation of $e$ is $i$.
@@ -3452,22 +3450,10 @@
 {\bf namedArgument:}
       label expression % could be top level expression?
     .
-
-%spreadArgument:
-%     '...' expression
- %   .
  \end{grammar}
 
 Evaluation of an actual argument list of the form $(a_1, \ldots, a_m, q_1: a_{m+1}, \ldots, q_l: a_{m+l})$ proceeds as follows:
 
-%Furthermore, if $p_k$ is a rest parameter, then one of the following cases holds:
-%\begin{enumerate}
-%\item $m = k-1$. Then $p_k$ is bound to a freshly allocated empty list. \Q{cant we share it? identity?}
-%\item $m = k$, and $a_k$ is a spread argument ...$e_k$. Then $p_k$ is bound to the value of $e_k$.  In checked mode, it is a dynamic type error if  the type of $p_k$ is not a supertype of the value of $e_k$.
-%\item $m \ge k$.  A freshly allocated list $r$ of the type of $p_k$ with size $m - k + 1$ is allocated. and initialized such that $r_j = a_{k+j}, 0 \le j \le m - k$. Then $p_k$ is bound to $r$.
-%\end{enumerate}
-
-%Otherwise, i
 The arguments $a_1, \ldots, a_{m+l}$ are evaluated in the order they appear in the program, yielding objects $o_1, \ldots, o_{m+l}$.
 
 \commentary{Simply stated, an argument list consisting of $m$ positional arguments and $l$ named arguments is evaluated from left to right.
@@ -4391,7 +4377,7 @@
  
  Evaluation of the is-expression \code{$e$ \IS{} $T$} proceeds as follows:
 
-The expression $e$ is evaluated to a value $v$. Then, if the interface of the class of $v$ is a subtype of $T$, the is-expression evaluates to true. Otherwise it evaluates to false.
+The expression $e$ is evaluated to a value $v$. Then, if $T$ is malformed, a dynamic error occurs. Otherwise, if the interface of the class of $v$ is a subtype of $T$, the is-expression evaluates to true. Otherwise it evaluates to false.
 
 \commentary{It follows that \code{$e$ \IS{} Object} is always true. This makes sense in a language where everything is an object. 
 
@@ -4402,17 +4388,6 @@
 
 % Add flow dependent types
 
-\commentary{
-If $T$ is malformed the test always succeeds. This is a consequence of the rule that malformed types are treated as \DYNAMIC{}
-}
-%does not denote a type available in the current lexical scope. It is a %compile-time error % CHANGED
-%run-time error
-%if $T$ is a parameterized type of the form $G<T_1, \ldots, T_n>$ and $G$ is not a generic type with $n$ type parameters.
-
-%Note, that, in checked mode, it is a dynamic type error if a malformed type is used in a type test as specified in \ref{dynamicTypeSystem}.
-
-%It is a static warning if $T$ is malformed or malbounded.
-%does not denote a type available in the current lexical scope. 
 
 Let $v$  be a local variable or a formal parameter. An is-expression of the form \code{$v$ \IS{} $T$} shows that $v$  has type $T$ iff $T$ is more specific than the type $S$ of the expression $v$ and  both $T \ne \DYNAMIC{}$ and $S \ne \DYNAMIC{}$.
 
@@ -4427,8 +4402,6 @@
 }
 
 The static type of an is-expression is \code{bool}. 
-%It is a static warning if if $T$ is a parameterized type of the form $G<T_1, \ldots, T_n>$ and $G$ is not a generic type with $n$ type parameters. 
-
 
 
 \subsection{ Type Cast}
@@ -4449,23 +4422,10 @@
  
  Evaluation of the cast expression \code{$e$ \AS{} $T$} proceeds as follows:
 
-The expression $e$ is evaluated to a value $v$. Then, if the interface of the class of $v$ is a subtype of $T$, the cast expression evaluates to $v$. Otherwise, if $v$ is \NULL{}, the cast expression evaluates to $v$. 
+The expression $e$ is evaluated to a value $v$. Then, if $T$ is malformed, a dynamic error occurs. Otherwise, if the interface of the class of $v$ is a subtype of $T$, the cast expression evaluates to $v$. Otherwise, if $v$ is \NULL{}, the cast expression evaluates to $v$. 
 In all other cases,  a \code{CastError} is thrown.
-
-\commentary{
-If $T$ is malformed the cast always succeeds. This is a consequence of the rule that malformed types are treated as \DYNAMIC{}
-}
-
-%does not denote a type available in the current lexical scope. It is a %compile-time error ; CHANGED 
-%run-time error
-%if $T$ is a parameterized type of the form $G<T_1, \ldots, T_n>$ and $G$ is not a generic type with $n$ type parameters.
-
-%Note, that, in checked mode, it is a dynamic type error if a malformed type is used in a type cast as specified in \ref{dynamicTypeSystem}.
-
-%It is a static warning if $T$ is malformed or malbounded.
-%does not denote a type available in the current lexical scope. 
+ 
 The static type of a cast expression  \code{$e$ \AS{} $T$}  is $T$. 
-%It is a static warning if if $T$ is a parameterized type of the form $G<T_1, \ldots, T_n>$ and $G$ is not a generic type with $n$ type parameters. 
 
 
 \section{Statements}
@@ -4836,8 +4796,6 @@
 The \SWITCH{}  statement should only be used in very limited situations (e.g., interpreters or scanners).  
 }
 
-%A switch statement {\SWITCH{} ($e$)  \{ $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1 \ldots$ $label_{n1} \ldots label_{nj_n}$  \CASE{} $e_n: s_n$ \}} is equivalent to switch statement \code{\SWITCH{} ($e$) \{ $label_{11} \ldots label_{1j_1}$ \CASE{}  $e_1: s_1 \ldots$ $label_{n1} \ldots label_{nj_n}$ \CASE{}  $e_n: s_n$ \DEFAULT{}: \}}
-
 Execution of a switch statement of the form \code{\SWITCH{} ($e$) \{ \CASE{} $label_{11} \ldots label_{1j_1}$ $e_1: s_1 \ldots$  \CASE{} $label_{n1} \ldots label_{nj_n}$ $e_n: s_n$ \DEFAULT{}: $s_{n+1}$ \}} or the form \code{\SWITCH{} ($e$) \{ \CASE{} $label_{11} \ldots label_{1j_1}$ $e_1: s_1 \ldots$  \CASE{} $label_{n1} \ldots label_{nj_n}$ $e_n: s_n$ \}} proceeds as follows:
 
 The statement \code{\VAR{} id = $e$;} is evaluated, where \code{id} is a variable whose name is distinct from any other variable in the program. 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$. 
@@ -4944,7 +4902,7 @@
 The syntax is designed to be upward compatible with existing Javascript programs. The \ON{} clause can be omitted, leaving what looks like a Javascript catch clause.
 }
 
-An \ON{}-\CATCH{} clause of   the form   \code{\ON{} $T$ \CATCH{} ($p_1, p_2$) $s$}  {\em matches} an object $o$  if the type of $o$ is a subtype of $T$. 
+An \ON{}-\CATCH{} clause of   the form   \code{\ON{} $T$ \CATCH{} ($p_1, p_2$) $s$}  {\em matches} an object $o$  if the type of $o$ is a subtype of $T$.  If $T$ is a malformed type, then performing a match causes a run time error.
 
 \commentary {
 It is of course a static warning if $T$ is a malformed type (\ref{staticTypes}).
@@ -5482,15 +5440,19 @@
 \subsection{Scripts}
 \label{scripts}
 
-A {\em script} is a library with a top-level function \code{main()}. 
+A {\em script} is a library whose exported namespace  (\ref{exports}) includes a top-level function \code{main()}. 
 A script $S$ may be executed as follows:
 
-First, $S$ is compiled as a library as specified above. Then, the top-level function \code{main()} that is in scope in $S$ is invoked with no arguments. It is a run time error if $S$ does not declare or import a top-level function \code{main()}.
+First, $S$ is compiled as a library as specified above. Then, the top-level function \code{main()} that is in the exported namespace of $S$ is invoked with no arguments. It is a run time error if $S$ does not declare or import a top-level function \code{main()}.
 
 \rationale{
 The names of scripts are optional, in the interests of interactive, informal use. However, any script of long term value should be given a name as a matter of good practice. 
 }
 
+\commentary {
+A Dart program will typically be executed by executing a script.
+}
+
 \subsection{URIs}
 \label{uris}
 
@@ -5581,12 +5543,13 @@
 %  \end{itemize}
 \end{itemize}
 
- 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 runtime.
- 
+ 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 runtime unless explicitly specified otherwise.
+  
  \rationale{
 This ensures that the developer is spared a series of cascading warnings as the malformed type interacts with other types.
 }
 
+
 \subsubsection{Type Promotion}
 \label{typePromotion}
 
@@ -5605,7 +5568,7 @@
 %It is a run-time type error to access an undeclared type outside .
 
 %It is a dynamic type error if a malformed type is used in a subtype test.  
-In checked mode, it is a dynamic type error if  a malbounded (\ref{parameterizedTypes}) 
+In checked mode, it is a dynamic type error if a malformed or malbounded (\ref{parameterizedTypes}) 
 type is used in a subtype test.  
 
 %In production mode, an undeclared type is treated as an instance of type \DYNAMIC{}. 
@@ -5637,19 +5600,9 @@
 \end{dartCode}
 
 \commentary{
-Since $i$ is not a type, a static warning will be issue at the declaration of $j$. However, the program can be executed without incident.  The undeclared type $i$ is treated as \DYNAMIC{}, so even in checked mode, the implicit subtype test at the assignment  succeeds.
+Since $i$ is not a type, a static warning will be issue at the declaration of $j$. However, the program can be executed without incident in production mode because he undeclared type $i$ is treated as \DYNAMIC{}. However, in checked mode, the implicit subtype test at the assignment will trigger an error at runtime.
 }
 
-\rationale{
-We have chosen to treat malformed types  as type \DYNAMIC{}. Earlier versions of this specification did so in some cases but not in others. We found the rules to be too complex, and have opted to harmonize the specification. Given that a static warning is issued, there is no need for the runtime to deal with extra complexity by treating malformed types specially.
-
-
-%as is done in production mode. After all, a static warning has already been given. That is a legitimate design option, and it is ultimately a judgement call as to whether checked mode should be more or less aggressive in dealing with such a situation.
-
-%Likewise, we could opt to ignore malformed types entirely in checked mode.
-
-%For now, we have opted to treat a malformed type as an error type that has no subtypes or supertypes, and which causes a runtime error when tested against any other type.
-}
 
 \commentary{
 Here is an example involving malbounded types:
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 1c1f428..3a430d9 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -14626,6 +14626,526 @@
   }
 }
 /**
+ * Instances of the class `ASTComparator` compare the structure of two ASTNodes to see whether
+ * they are equal.
+ */
+class ASTComparator implements ASTVisitor<bool> {
+
+  /**
+   * Return `true` if the two AST nodes are equal.
+   *
+   * @param first the first node being compared
+   * @param second the second node being compared
+   * @return `true` if the two AST nodes are equal
+   */
+  static bool equals3(CompilationUnit first, CompilationUnit second) {
+    ASTComparator comparator = new ASTComparator();
+    return comparator.isEqual(first, second);
+  }
+
+  /**
+   * The AST node with which the node being visited is to be compared. This is only valid at the
+   * beginning of each visit method (until [isEqual] is invoked).
+   */
+  ASTNode _other;
+  bool visitAdjacentStrings(AdjacentStrings node) {
+    AdjacentStrings other = this._other as AdjacentStrings;
+    return isEqual5(node.strings, other.strings);
+  }
+  bool visitAnnotation(Annotation node) {
+    Annotation other = this._other as Annotation;
+    return isEqual6(node.atSign, other.atSign) && isEqual(node.name, other.name) && isEqual6(node.period, other.period) && isEqual(node.constructorName, other.constructorName) && isEqual(node.arguments, other.arguments);
+  }
+  bool visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
+    ArgumentDefinitionTest other = this._other as ArgumentDefinitionTest;
+    return isEqual6(node.question, other.question) && isEqual(node.identifier, other.identifier);
+  }
+  bool visitArgumentList(ArgumentList node) {
+    ArgumentList other = this._other as ArgumentList;
+    return isEqual6(node.leftParenthesis, other.leftParenthesis) && isEqual5(node.arguments, other.arguments) && isEqual6(node.rightParenthesis, other.rightParenthesis);
+  }
+  bool visitAsExpression(AsExpression node) {
+    AsExpression other = this._other as AsExpression;
+    return isEqual(node.expression, other.expression) && isEqual6(node.asOperator, other.asOperator) && isEqual(node.type, other.type);
+  }
+  bool visitAssertStatement(AssertStatement node) {
+    AssertStatement other = this._other as AssertStatement;
+    return isEqual6(node.keyword, other.keyword) && isEqual6(node.leftParenthesis, other.leftParenthesis) && isEqual(node.condition, other.condition) && isEqual6(node.rightParenthesis, other.rightParenthesis) && isEqual6(node.semicolon, other.semicolon);
+  }
+  bool visitAssignmentExpression(AssignmentExpression node) {
+    AssignmentExpression other = this._other as AssignmentExpression;
+    return isEqual(node.leftHandSide, other.leftHandSide) && isEqual6(node.operator, other.operator) && isEqual(node.rightHandSide, other.rightHandSide);
+  }
+  bool visitBinaryExpression(BinaryExpression node) {
+    BinaryExpression other = this._other as BinaryExpression;
+    return isEqual(node.leftOperand, other.leftOperand) && isEqual6(node.operator, other.operator) && isEqual(node.rightOperand, other.rightOperand);
+  }
+  bool visitBlock(Block node) {
+    Block other = this._other as Block;
+    return isEqual6(node.leftBracket, other.leftBracket) && isEqual5(node.statements, other.statements) && isEqual6(node.rightBracket, other.rightBracket);
+  }
+  bool visitBlockFunctionBody(BlockFunctionBody node) {
+    BlockFunctionBody other = this._other as BlockFunctionBody;
+    return isEqual(node.block, other.block);
+  }
+  bool visitBooleanLiteral(BooleanLiteral node) {
+    BooleanLiteral other = this._other as BooleanLiteral;
+    return isEqual6(node.literal, other.literal) && identical(node.value, other.value);
+  }
+  bool visitBreakStatement(BreakStatement node) {
+    BreakStatement other = this._other as BreakStatement;
+    return isEqual6(node.keyword, other.keyword) && isEqual(node.label, other.label) && isEqual6(node.semicolon, other.semicolon);
+  }
+  bool visitCascadeExpression(CascadeExpression node) {
+    CascadeExpression other = this._other as CascadeExpression;
+    return isEqual(node.target, other.target) && isEqual5(node.cascadeSections, other.cascadeSections);
+  }
+  bool visitCatchClause(CatchClause node) {
+    CatchClause other = this._other as CatchClause;
+    return isEqual6(node.onKeyword, other.onKeyword) && isEqual(node.exceptionType, other.exceptionType) && isEqual6(node.catchKeyword, other.catchKeyword) && isEqual6(node.leftParenthesis, other.leftParenthesis) && isEqual(node.exceptionParameter, other.exceptionParameter) && isEqual6(node.comma, other.comma) && isEqual(node.stackTraceParameter, other.stackTraceParameter) && isEqual6(node.rightParenthesis, other.rightParenthesis) && isEqual(node.body, other.body);
+  }
+  bool visitClassDeclaration(ClassDeclaration node) {
+    ClassDeclaration other = this._other as ClassDeclaration;
+    return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.abstractKeyword, other.abstractKeyword) && isEqual6(node.classKeyword, other.classKeyword) && isEqual(node.name, other.name) && isEqual(node.typeParameters, other.typeParameters) && isEqual(node.extendsClause, other.extendsClause) && isEqual(node.withClause, other.withClause) && isEqual(node.implementsClause, other.implementsClause) && isEqual6(node.leftBracket, other.leftBracket) && isEqual5(node.members, other.members) && isEqual6(node.rightBracket, other.rightBracket);
+  }
+  bool visitClassTypeAlias(ClassTypeAlias node) {
+    ClassTypeAlias other = this._other as ClassTypeAlias;
+    return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.keyword, other.keyword) && isEqual(node.name, other.name) && isEqual(node.typeParameters, other.typeParameters) && isEqual6(node.equals, other.equals) && isEqual6(node.abstractKeyword, other.abstractKeyword) && isEqual(node.superclass, other.superclass) && isEqual(node.withClause, other.withClause) && isEqual(node.implementsClause, other.implementsClause) && isEqual6(node.semicolon, other.semicolon);
+  }
+  bool visitComment(Comment node) {
+    Comment other = this._other as Comment;
+    return isEqual5(node.references, other.references);
+  }
+  bool visitCommentReference(CommentReference node) {
+    CommentReference other = this._other as CommentReference;
+    return isEqual6(node.newKeyword, other.newKeyword) && isEqual(node.identifier, other.identifier);
+  }
+  bool visitCompilationUnit(CompilationUnit node) {
+    CompilationUnit other = this._other as CompilationUnit;
+    return isEqual6(node.beginToken, other.beginToken) && isEqual(node.scriptTag, other.scriptTag) && isEqual5(node.directives, other.directives) && isEqual5(node.declarations, other.declarations) && isEqual6(node.endToken, other.endToken);
+  }
+  bool visitConditionalExpression(ConditionalExpression node) {
+    ConditionalExpression other = this._other as ConditionalExpression;
+    return isEqual(node.condition, other.condition) && isEqual6(node.question, other.question) && isEqual(node.thenExpression, other.thenExpression) && isEqual6(node.colon, other.colon) && isEqual(node.elseExpression, other.elseExpression);
+  }
+  bool visitConstructorDeclaration(ConstructorDeclaration node) {
+    ConstructorDeclaration other = this._other as ConstructorDeclaration;
+    return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.externalKeyword, other.externalKeyword) && isEqual6(node.constKeyword, other.constKeyword) && isEqual6(node.factoryKeyword, other.factoryKeyword) && isEqual(node.returnType, other.returnType) && isEqual6(node.period, other.period) && isEqual(node.name, other.name) && isEqual(node.parameters, other.parameters) && isEqual6(node.separator, other.separator) && isEqual5(node.initializers, other.initializers) && isEqual(node.redirectedConstructor, other.redirectedConstructor) && isEqual(node.body, other.body);
+  }
+  bool visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    ConstructorFieldInitializer other = this._other as ConstructorFieldInitializer;
+    return isEqual6(node.keyword, other.keyword) && isEqual6(node.period, other.period) && isEqual(node.fieldName, other.fieldName) && isEqual6(node.equals, other.equals) && isEqual(node.expression, other.expression);
+  }
+  bool visitConstructorName(ConstructorName node) {
+    ConstructorName other = this._other as ConstructorName;
+    return isEqual(node.type, other.type) && isEqual6(node.period, other.period) && isEqual(node.name, other.name);
+  }
+  bool visitContinueStatement(ContinueStatement node) {
+    ContinueStatement other = this._other as ContinueStatement;
+    return isEqual6(node.keyword, other.keyword) && isEqual(node.label, other.label) && isEqual6(node.semicolon, other.semicolon);
+  }
+  bool visitDeclaredIdentifier(DeclaredIdentifier node) {
+    DeclaredIdentifier other = this._other as DeclaredIdentifier;
+    return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.keyword, other.keyword) && isEqual(node.type, other.type) && isEqual(node.identifier, other.identifier);
+  }
+  bool visitDefaultFormalParameter(DefaultFormalParameter node) {
+    DefaultFormalParameter other = this._other as DefaultFormalParameter;
+    return isEqual(node.parameter, other.parameter) && identical(node.kind, other.kind) && isEqual6(node.separator, other.separator) && isEqual(node.defaultValue, other.defaultValue);
+  }
+  bool visitDoStatement(DoStatement node) {
+    DoStatement other = this._other as DoStatement;
+    return isEqual6(node.doKeyword, other.doKeyword) && isEqual(node.body, other.body) && isEqual6(node.whileKeyword, other.whileKeyword) && isEqual6(node.leftParenthesis, other.leftParenthesis) && isEqual(node.condition, other.condition) && isEqual6(node.rightParenthesis, other.rightParenthesis) && isEqual6(node.semicolon, other.semicolon);
+  }
+  bool visitDoubleLiteral(DoubleLiteral node) {
+    DoubleLiteral other = this._other as DoubleLiteral;
+    return isEqual6(node.literal, other.literal) && node.value == other.value;
+  }
+  bool visitEmptyFunctionBody(EmptyFunctionBody node) {
+    EmptyFunctionBody other = this._other as EmptyFunctionBody;
+    return isEqual6(node.semicolon, other.semicolon);
+  }
+  bool visitEmptyStatement(EmptyStatement node) {
+    EmptyStatement other = this._other as EmptyStatement;
+    return isEqual6(node.semicolon, other.semicolon);
+  }
+  bool visitExportDirective(ExportDirective node) {
+    ExportDirective other = this._other as ExportDirective;
+    return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.keyword, other.keyword) && isEqual(node.uri, other.uri) && isEqual5(node.combinators, other.combinators) && isEqual6(node.semicolon, other.semicolon);
+  }
+  bool visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    ExpressionFunctionBody other = this._other as ExpressionFunctionBody;
+    return isEqual6(node.functionDefinition, other.functionDefinition) && isEqual(node.expression, other.expression) && isEqual6(node.semicolon, other.semicolon);
+  }
+  bool visitExpressionStatement(ExpressionStatement node) {
+    ExpressionStatement other = this._other as ExpressionStatement;
+    return isEqual(node.expression, other.expression) && isEqual6(node.semicolon, other.semicolon);
+  }
+  bool visitExtendsClause(ExtendsClause node) {
+    ExtendsClause other = this._other as ExtendsClause;
+    return isEqual6(node.keyword, other.keyword) && isEqual(node.superclass, other.superclass);
+  }
+  bool visitFieldDeclaration(FieldDeclaration node) {
+    FieldDeclaration other = this._other as FieldDeclaration;
+    return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.staticKeyword, other.staticKeyword) && isEqual(node.fields, other.fields) && isEqual6(node.semicolon, other.semicolon);
+  }
+  bool visitFieldFormalParameter(FieldFormalParameter node) {
+    FieldFormalParameter other = this._other as FieldFormalParameter;
+    return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.keyword, other.keyword) && isEqual(node.type, other.type) && isEqual6(node.thisToken, other.thisToken) && isEqual6(node.period, other.period) && isEqual(node.identifier, other.identifier);
+  }
+  bool visitForEachStatement(ForEachStatement node) {
+    ForEachStatement other = this._other as ForEachStatement;
+    return isEqual6(node.forKeyword, other.forKeyword) && isEqual6(node.leftParenthesis, other.leftParenthesis) && isEqual(node.loopVariable, other.loopVariable) && isEqual6(node.inKeyword, other.inKeyword) && isEqual(node.iterator, other.iterator) && isEqual6(node.rightParenthesis, other.rightParenthesis) && isEqual(node.body, other.body);
+  }
+  bool visitFormalParameterList(FormalParameterList node) {
+    FormalParameterList other = this._other as FormalParameterList;
+    return isEqual6(node.leftParenthesis, other.leftParenthesis) && isEqual5(node.parameters, other.parameters) && isEqual6(node.leftDelimiter, other.leftDelimiter) && isEqual6(node.rightDelimiter, other.rightDelimiter) && isEqual6(node.rightParenthesis, other.rightParenthesis);
+  }
+  bool visitForStatement(ForStatement node) {
+    ForStatement other = this._other as ForStatement;
+    return isEqual6(node.forKeyword, other.forKeyword) && isEqual6(node.leftParenthesis, other.leftParenthesis) && isEqual(node.variables, other.variables) && isEqual(node.initialization, other.initialization) && isEqual6(node.leftSeparator, other.leftSeparator) && isEqual(node.condition, other.condition) && isEqual6(node.rightSeparator, other.rightSeparator) && isEqual5(node.updaters, other.updaters) && isEqual6(node.rightParenthesis, other.rightParenthesis) && isEqual(node.body, other.body);
+  }
+  bool visitFunctionDeclaration(FunctionDeclaration node) {
+    FunctionDeclaration other = this._other as FunctionDeclaration;
+    return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.externalKeyword, other.externalKeyword) && isEqual(node.returnType, other.returnType) && isEqual6(node.propertyKeyword, other.propertyKeyword) && isEqual(node.name, other.name) && isEqual(node.functionExpression, other.functionExpression);
+  }
+  bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+    FunctionDeclarationStatement other = this._other as FunctionDeclarationStatement;
+    return isEqual(node.functionDeclaration, other.functionDeclaration);
+  }
+  bool visitFunctionExpression(FunctionExpression node) {
+    FunctionExpression other = this._other as FunctionExpression;
+    return isEqual(node.parameters, other.parameters) && isEqual(node.body, other.body);
+  }
+  bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    FunctionExpressionInvocation other = this._other as FunctionExpressionInvocation;
+    return isEqual(node.function, other.function) && isEqual(node.argumentList, other.argumentList);
+  }
+  bool visitFunctionTypeAlias(FunctionTypeAlias node) {
+    FunctionTypeAlias other = this._other as FunctionTypeAlias;
+    return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.keyword, other.keyword) && isEqual(node.returnType, other.returnType) && isEqual(node.name, other.name) && isEqual(node.typeParameters, other.typeParameters) && isEqual(node.parameters, other.parameters) && isEqual6(node.semicolon, other.semicolon);
+  }
+  bool visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    FunctionTypedFormalParameter other = this._other as FunctionTypedFormalParameter;
+    return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual(node.returnType, other.returnType) && isEqual(node.identifier, other.identifier) && isEqual(node.parameters, other.parameters);
+  }
+  bool visitHideCombinator(HideCombinator node) {
+    HideCombinator other = this._other as HideCombinator;
+    return isEqual6(node.keyword, other.keyword) && isEqual5(node.hiddenNames, other.hiddenNames);
+  }
+  bool visitIfStatement(IfStatement node) {
+    IfStatement other = this._other as IfStatement;
+    return isEqual6(node.ifKeyword, other.ifKeyword) && isEqual6(node.leftParenthesis, other.leftParenthesis) && isEqual(node.condition, other.condition) && isEqual6(node.rightParenthesis, other.rightParenthesis) && isEqual(node.thenStatement, other.thenStatement) && isEqual6(node.elseKeyword, other.elseKeyword) && isEqual(node.elseStatement, other.elseStatement);
+  }
+  bool visitImplementsClause(ImplementsClause node) {
+    ImplementsClause other = this._other as ImplementsClause;
+    return isEqual6(node.keyword, other.keyword) && isEqual5(node.interfaces, other.interfaces);
+  }
+  bool visitImportDirective(ImportDirective node) {
+    ImportDirective other = this._other as ImportDirective;
+    return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.keyword, other.keyword) && isEqual(node.uri, other.uri) && isEqual6(node.asToken, other.asToken) && isEqual(node.prefix, other.prefix) && isEqual5(node.combinators, other.combinators) && isEqual6(node.semicolon, other.semicolon);
+  }
+  bool visitIndexExpression(IndexExpression node) {
+    IndexExpression other = this._other as IndexExpression;
+    return isEqual(node.target, other.target) && isEqual6(node.leftBracket, other.leftBracket) && isEqual(node.index, other.index) && isEqual6(node.rightBracket, other.rightBracket);
+  }
+  bool visitInstanceCreationExpression(InstanceCreationExpression node) {
+    InstanceCreationExpression other = this._other as InstanceCreationExpression;
+    return isEqual6(node.keyword, other.keyword) && isEqual(node.constructorName, other.constructorName) && isEqual(node.argumentList, other.argumentList);
+  }
+  bool visitIntegerLiteral(IntegerLiteral node) {
+    IntegerLiteral other = this._other as IntegerLiteral;
+    return isEqual6(node.literal, other.literal) && identical(node.value, other.value);
+  }
+  bool visitInterpolationExpression(InterpolationExpression node) {
+    InterpolationExpression other = this._other as InterpolationExpression;
+    return isEqual6(node.leftBracket, other.leftBracket) && isEqual(node.expression, other.expression) && isEqual6(node.rightBracket, other.rightBracket);
+  }
+  bool visitInterpolationString(InterpolationString node) {
+    InterpolationString other = this._other as InterpolationString;
+    return isEqual6(node.contents, other.contents) && node.value == other.value;
+  }
+  bool visitIsExpression(IsExpression node) {
+    IsExpression other = this._other as IsExpression;
+    return isEqual(node.expression, other.expression) && isEqual6(node.isOperator, other.isOperator) && isEqual6(node.notOperator, other.notOperator) && isEqual(node.type, other.type);
+  }
+  bool visitLabel(Label node) {
+    Label other = this._other as Label;
+    return isEqual(node.label, other.label) && isEqual6(node.colon, other.colon);
+  }
+  bool visitLabeledStatement(LabeledStatement node) {
+    LabeledStatement other = this._other as LabeledStatement;
+    return isEqual5(node.labels, other.labels) && isEqual(node.statement, other.statement);
+  }
+  bool visitLibraryDirective(LibraryDirective node) {
+    LibraryDirective other = this._other as LibraryDirective;
+    return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.libraryToken, other.libraryToken) && isEqual(node.name, other.name) && isEqual6(node.semicolon, other.semicolon);
+  }
+  bool visitLibraryIdentifier(LibraryIdentifier node) {
+    LibraryIdentifier other = this._other as LibraryIdentifier;
+    return isEqual5(node.components, other.components);
+  }
+  bool visitListLiteral(ListLiteral node) {
+    ListLiteral other = this._other as ListLiteral;
+    return isEqual6(node.constKeyword, other.constKeyword) && isEqual(node.typeArguments, other.typeArguments) && isEqual6(node.leftBracket, other.leftBracket) && isEqual5(node.elements, other.elements) && isEqual6(node.rightBracket, other.rightBracket);
+  }
+  bool visitMapLiteral(MapLiteral node) {
+    MapLiteral other = this._other as MapLiteral;
+    return isEqual6(node.constKeyword, other.constKeyword) && isEqual(node.typeArguments, other.typeArguments) && isEqual6(node.leftBracket, other.leftBracket) && isEqual5(node.entries, other.entries) && isEqual6(node.rightBracket, other.rightBracket);
+  }
+  bool visitMapLiteralEntry(MapLiteralEntry node) {
+    MapLiteralEntry other = this._other as MapLiteralEntry;
+    return isEqual(node.key, other.key) && isEqual6(node.separator, other.separator) && isEqual(node.value, other.value);
+  }
+  bool visitMethodDeclaration(MethodDeclaration node) {
+    MethodDeclaration other = this._other as MethodDeclaration;
+    return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.externalKeyword, other.externalKeyword) && isEqual6(node.modifierKeyword, other.modifierKeyword) && isEqual(node.returnType, other.returnType) && isEqual6(node.propertyKeyword, other.propertyKeyword) && isEqual6(node.propertyKeyword, other.propertyKeyword) && isEqual(node.name, other.name) && isEqual(node.parameters, other.parameters) && isEqual(node.body, other.body);
+  }
+  bool visitMethodInvocation(MethodInvocation node) {
+    MethodInvocation other = this._other as MethodInvocation;
+    return isEqual(node.target, other.target) && isEqual6(node.period, other.period) && isEqual(node.methodName, other.methodName) && isEqual(node.argumentList, other.argumentList);
+  }
+  bool visitNamedExpression(NamedExpression node) {
+    NamedExpression other = this._other as NamedExpression;
+    return isEqual(node.name, other.name) && isEqual(node.expression, other.expression);
+  }
+  bool visitNativeClause(NativeClause node) {
+    NativeClause other = this._other as NativeClause;
+    return isEqual6(node.keyword, other.keyword) && isEqual(node.name, other.name);
+  }
+  bool visitNativeFunctionBody(NativeFunctionBody node) {
+    NativeFunctionBody other = this._other as NativeFunctionBody;
+    return isEqual6(node.nativeToken, other.nativeToken) && isEqual(node.stringLiteral, other.stringLiteral) && isEqual6(node.semicolon, other.semicolon);
+  }
+  bool visitNullLiteral(NullLiteral node) {
+    NullLiteral other = this._other as NullLiteral;
+    return isEqual6(node.literal, other.literal);
+  }
+  bool visitParenthesizedExpression(ParenthesizedExpression node) {
+    ParenthesizedExpression other = this._other as ParenthesizedExpression;
+    return isEqual6(node.leftParenthesis, other.leftParenthesis) && isEqual(node.expression, other.expression) && isEqual6(node.rightParenthesis, other.rightParenthesis);
+  }
+  bool visitPartDirective(PartDirective node) {
+    PartDirective other = this._other as PartDirective;
+    return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.partToken, other.partToken) && isEqual(node.uri, other.uri) && isEqual6(node.semicolon, other.semicolon);
+  }
+  bool visitPartOfDirective(PartOfDirective node) {
+    PartOfDirective other = this._other as PartOfDirective;
+    return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.partToken, other.partToken) && isEqual6(node.ofToken, other.ofToken) && isEqual(node.libraryName, other.libraryName) && isEqual6(node.semicolon, other.semicolon);
+  }
+  bool visitPostfixExpression(PostfixExpression node) {
+    PostfixExpression other = this._other as PostfixExpression;
+    return isEqual(node.operand, other.operand) && isEqual6(node.operator, other.operator);
+  }
+  bool visitPrefixedIdentifier(PrefixedIdentifier node) {
+    PrefixedIdentifier other = this._other as PrefixedIdentifier;
+    return isEqual(node.prefix, other.prefix) && isEqual6(node.period, other.period) && isEqual(node.identifier, other.identifier);
+  }
+  bool visitPrefixExpression(PrefixExpression node) {
+    PrefixExpression other = this._other as PrefixExpression;
+    return isEqual6(node.operator, other.operator) && isEqual(node.operand, other.operand);
+  }
+  bool visitPropertyAccess(PropertyAccess node) {
+    PropertyAccess other = this._other as PropertyAccess;
+    return isEqual(node.target, other.target) && isEqual6(node.operator, other.operator) && isEqual(node.propertyName, other.propertyName);
+  }
+  bool visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
+    RedirectingConstructorInvocation other = this._other as RedirectingConstructorInvocation;
+    return isEqual6(node.keyword, other.keyword) && isEqual6(node.period, other.period) && isEqual(node.constructorName, other.constructorName) && isEqual(node.argumentList, other.argumentList);
+  }
+  bool visitRethrowExpression(RethrowExpression node) {
+    RethrowExpression other = this._other as RethrowExpression;
+    return isEqual6(node.keyword, other.keyword);
+  }
+  bool visitReturnStatement(ReturnStatement node) {
+    ReturnStatement other = this._other as ReturnStatement;
+    return isEqual6(node.keyword, other.keyword) && isEqual(node.expression, other.expression) && isEqual6(node.semicolon, other.semicolon);
+  }
+  bool visitScriptTag(ScriptTag node) {
+    ScriptTag other = this._other as ScriptTag;
+    return isEqual6(node.scriptTag, other.scriptTag);
+  }
+  bool visitShowCombinator(ShowCombinator node) {
+    ShowCombinator other = this._other as ShowCombinator;
+    return isEqual6(node.keyword, other.keyword) && isEqual5(node.shownNames, other.shownNames);
+  }
+  bool visitSimpleFormalParameter(SimpleFormalParameter node) {
+    SimpleFormalParameter other = this._other as SimpleFormalParameter;
+    return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.keyword, other.keyword) && isEqual(node.type, other.type) && isEqual(node.identifier, other.identifier);
+  }
+  bool visitSimpleIdentifier(SimpleIdentifier node) {
+    SimpleIdentifier other = this._other as SimpleIdentifier;
+    return isEqual6(node.token, other.token);
+  }
+  bool visitSimpleStringLiteral(SimpleStringLiteral node) {
+    SimpleStringLiteral other = this._other as SimpleStringLiteral;
+    return isEqual6(node.literal, other.literal) && identical(node.value, other.value);
+  }
+  bool visitStringInterpolation(StringInterpolation node) {
+    StringInterpolation other = this._other as StringInterpolation;
+    return isEqual5(node.elements, other.elements);
+  }
+  bool visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    SuperConstructorInvocation other = this._other as SuperConstructorInvocation;
+    return isEqual6(node.keyword, other.keyword) && isEqual6(node.period, other.period) && isEqual(node.constructorName, other.constructorName) && isEqual(node.argumentList, other.argumentList);
+  }
+  bool visitSuperExpression(SuperExpression node) {
+    SuperExpression other = this._other as SuperExpression;
+    return isEqual6(node.keyword, other.keyword);
+  }
+  bool visitSwitchCase(SwitchCase node) {
+    SwitchCase other = this._other as SwitchCase;
+    return isEqual5(node.labels, other.labels) && isEqual6(node.keyword, other.keyword) && isEqual(node.expression, other.expression) && isEqual6(node.colon, other.colon) && isEqual5(node.statements, other.statements);
+  }
+  bool visitSwitchDefault(SwitchDefault node) {
+    SwitchDefault other = this._other as SwitchDefault;
+    return isEqual5(node.labels, other.labels) && isEqual6(node.keyword, other.keyword) && isEqual6(node.colon, other.colon) && isEqual5(node.statements, other.statements);
+  }
+  bool visitSwitchStatement(SwitchStatement node) {
+    SwitchStatement other = this._other as SwitchStatement;
+    return isEqual6(node.keyword, other.keyword) && isEqual6(node.leftParenthesis, other.leftParenthesis) && isEqual(node.expression, other.expression) && isEqual6(node.rightParenthesis, other.rightParenthesis) && isEqual6(node.leftBracket, other.leftBracket) && isEqual5(node.members, other.members) && isEqual6(node.rightBracket, other.rightBracket);
+  }
+  bool visitSymbolLiteral(SymbolLiteral node) {
+    SymbolLiteral other = this._other as SymbolLiteral;
+    return isEqual6(node.poundSign, other.poundSign) && isEqual7(node.components, other.components);
+  }
+  bool visitThisExpression(ThisExpression node) {
+    ThisExpression other = this._other as ThisExpression;
+    return isEqual6(node.keyword, other.keyword);
+  }
+  bool visitThrowExpression(ThrowExpression node) {
+    ThrowExpression other = this._other as ThrowExpression;
+    return isEqual6(node.keyword, other.keyword) && isEqual(node.expression, other.expression);
+  }
+  bool visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    TopLevelVariableDeclaration other = this._other as TopLevelVariableDeclaration;
+    return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual(node.variables, other.variables) && isEqual6(node.semicolon, other.semicolon);
+  }
+  bool visitTryStatement(TryStatement node) {
+    TryStatement other = this._other as TryStatement;
+    return isEqual6(node.tryKeyword, other.tryKeyword) && isEqual(node.body, other.body) && isEqual5(node.catchClauses, other.catchClauses) && isEqual6(node.finallyKeyword, other.finallyKeyword) && isEqual(node.finallyBlock, other.finallyBlock);
+  }
+  bool visitTypeArgumentList(TypeArgumentList node) {
+    TypeArgumentList other = this._other as TypeArgumentList;
+    return isEqual6(node.leftBracket, other.leftBracket) && isEqual5(node.arguments, other.arguments) && isEqual6(node.rightBracket, other.rightBracket);
+  }
+  bool visitTypeName(TypeName node) {
+    TypeName other = this._other as TypeName;
+    return isEqual(node.name, other.name) && isEqual(node.typeArguments, other.typeArguments);
+  }
+  bool visitTypeParameter(TypeParameter node) {
+    TypeParameter other = this._other as TypeParameter;
+    return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual(node.name, other.name) && isEqual6(node.keyword, other.keyword) && isEqual(node.bound, other.bound);
+  }
+  bool visitTypeParameterList(TypeParameterList node) {
+    TypeParameterList other = this._other as TypeParameterList;
+    return isEqual6(node.leftBracket, other.leftBracket) && isEqual5(node.typeParameters, other.typeParameters) && isEqual6(node.rightBracket, other.rightBracket);
+  }
+  bool visitVariableDeclaration(VariableDeclaration node) {
+    VariableDeclaration other = this._other as VariableDeclaration;
+    return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual(node.name, other.name) && isEqual6(node.equals, other.equals) && isEqual(node.initializer, other.initializer);
+  }
+  bool visitVariableDeclarationList(VariableDeclarationList node) {
+    VariableDeclarationList other = this._other as VariableDeclarationList;
+    return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.keyword, other.keyword) && isEqual(node.type, other.type) && isEqual5(node.variables, other.variables);
+  }
+  bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    VariableDeclarationStatement other = this._other as VariableDeclarationStatement;
+    return isEqual(node.variables, other.variables) && isEqual6(node.semicolon, other.semicolon);
+  }
+  bool visitWhileStatement(WhileStatement node) {
+    WhileStatement other = this._other as WhileStatement;
+    return isEqual6(node.keyword, other.keyword) && isEqual6(node.leftParenthesis, other.leftParenthesis) && isEqual(node.condition, other.condition) && isEqual6(node.rightParenthesis, other.rightParenthesis) && isEqual(node.body, other.body);
+  }
+  bool visitWithClause(WithClause node) {
+    WithClause other = this._other as WithClause;
+    return isEqual6(node.withKeyword, other.withKeyword) && isEqual5(node.mixinTypes, other.mixinTypes);
+  }
+
+  /**
+   * Return `true` if the given AST nodes have the same structure.
+   *
+   * @param first the first node being compared
+   * @param second the second node being compared
+   * @return `true` if the given AST nodes have the same structure
+   */
+  bool isEqual(ASTNode first, ASTNode second) {
+    if (first == null) {
+      return second == null;
+    } else if (second == null) {
+      return false;
+    } else if (first.runtimeType != second.runtimeType) {
+      return false;
+    }
+    _other = second;
+    return first.accept(this);
+  }
+
+  /**
+   * Return `true` if the given lists of AST nodes have the same size and corresponding
+   * elements are equal.
+   *
+   * @param first the first node being compared
+   * @param second the second node being compared
+   * @return `true` if the given AST nodes have the same size and corresponding elements are
+   *         equal
+   */
+  bool isEqual5(NodeList first, NodeList second) {
+    if (first == null) {
+      return second == null;
+    } else if (second == null) {
+      return false;
+    }
+    int size = first.length;
+    if (second.length != size) {
+      return false;
+    }
+    for (int i = 0; i < size; i++) {
+      if (!isEqual(first[i], second[i])) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Return `true` if the given tokens have the same structure.
+   *
+   * @param first the first node being compared
+   * @param second the second node being compared
+   * @return `true` if the given tokens have the same structure
+   */
+  bool isEqual6(Token first, Token second) {
+    if (first == null) {
+      return second == null;
+    } else if (second == null) {
+      return false;
+    }
+    return first.offset == second.offset && first.length == second.length && first.lexeme == second.lexeme;
+  }
+
+  /**
+   * Return `true` if the given arrays of tokens have the same length and corresponding
+   * elements are equal.
+   *
+   * @param first the first node being compared
+   * @param second the second node being compared
+   * @return `true` if the given arrays of tokens have the same length and corresponding
+   *         elements are equal
+   */
+  bool isEqual7(List<Token> first, List<Token> second) {
+    int length = first.length;
+    if (second.length != length) {
+      return false;
+    }
+    for (int i = 0; i < length; i++) {
+      if (isEqual6(first[i], second[i])) {
+        return false;
+      }
+    }
+    return true;
+  }
+}
+/**
  * Instances of the class `IncrementalASTCloner` implement an object that will clone any AST
  * structure that it visits. The cloner will clone the structure, replacing the specified ASTNode
  * with a new ASTNode, mapping the old token stream to a new token stream, and preserving resolution
@@ -14684,7 +15204,9 @@
   AssignmentExpression visitAssignmentExpression(AssignmentExpression node) {
     AssignmentExpression copy = new AssignmentExpression.full(clone4(node.leftHandSide), map(node.operator), clone4(node.rightHandSide));
     copy.propagatedElement = node.propagatedElement;
+    copy.propagatedType = node.propagatedType;
     copy.staticElement = node.staticElement;
+    copy.staticType = node.staticType;
     return copy;
   }
   BinaryExpression visitBinaryExpression(BinaryExpression node) {
@@ -14900,7 +15422,9 @@
   }
   PostfixExpression visitPostfixExpression(PostfixExpression node) {
     PostfixExpression copy = new PostfixExpression.full(clone4(node.operand), map(node.operator));
+    copy.propagatedElement = node.propagatedElement;
     copy.propagatedType = node.propagatedType;
+    copy.staticElement = node.staticElement;
     copy.staticType = node.staticType;
     return copy;
   }
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index a43b3cb..4aa51c0 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -4312,7 +4312,12 @@
   /**
    * Is `true` if this variable is potentially mutated somewhere in its scope.
    */
-  bool _isPotentiallyMutated2 = false;
+  bool _isPotentiallyMutatedInScope2 = false;
+
+  /**
+   * Is `true` if this variable is potentially mutated somewhere in closure.
+   */
+  bool _isPotentiallyMutatedInClosure2 = false;
 
   /**
    * The offset to the beginning of the visible range for this element.
@@ -4344,13 +4349,21 @@
     }
     return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
   }
-  bool get isPotentiallyMutated => _isPotentiallyMutated2;
+  bool get isPotentiallyMutatedInClosure => _isPotentiallyMutatedInClosure2;
+  bool get isPotentiallyMutatedInScope => _isPotentiallyMutatedInScope2;
+
+  /**
+   * Specifies that this variable is potentially mutated somewhere in closure.
+   */
+  void markPotentiallyMutatedInClosure() {
+    _isPotentiallyMutatedInClosure2 = true;
+  }
 
   /**
    * Specifies that this variable is potentially mutated somewhere in its scope.
    */
-  void markPotentiallyMutated() {
-    _isPotentiallyMutated2 = true;
+  void markPotentiallyMutatedInScope() {
+    _isPotentiallyMutatedInScope2 = true;
   }
 
   /**
@@ -4613,7 +4626,12 @@
   /**
    * Is `true` if this variable is potentially mutated somewhere in its scope.
    */
-  bool _isPotentiallyMutated3 = false;
+  bool _isPotentiallyMutatedInScope3 = false;
+
+  /**
+   * Is `true` if this variable is potentially mutated somewhere in closure.
+   */
+  bool _isPotentiallyMutatedInClosure3 = false;
 
   /**
    * An array containing all of the parameters defined by this parameter element. There will only be
@@ -4685,13 +4703,21 @@
     return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
   }
   bool get isInitializingFormal => false;
-  bool get isPotentiallyMutated => _isPotentiallyMutated3;
+  bool get isPotentiallyMutatedInClosure => _isPotentiallyMutatedInClosure3;
+  bool get isPotentiallyMutatedInScope => _isPotentiallyMutatedInScope3;
+
+  /**
+   * Specifies that this variable is potentially mutated somewhere in closure.
+   */
+  void markPotentiallyMutatedInClosure() {
+    _isPotentiallyMutatedInClosure3 = true;
+  }
 
   /**
    * Specifies that this variable is potentially mutated somewhere in its scope.
    */
-  void markPotentiallyMutated() {
-    _isPotentiallyMutated3 = true;
+  void markPotentiallyMutatedInScope() {
+    _isPotentiallyMutatedInScope3 = true;
   }
 
   /**
@@ -5191,12 +5217,20 @@
   bool get isFinal => hasModifier(Modifier.FINAL);
 
   /**
+   * Return `true` if this variable is potentially mutated somewhere in closure. This
+   * information is only available for local variables (including parameters).
+   *
+   * @return `true` if this variable is potentially mutated somewhere in closure
+   */
+  bool get isPotentiallyMutatedInClosure => false;
+
+  /**
    * Return `true` if this variable is potentially mutated somewhere in its scope. This
    * information is only available for local variables (including parameters).
    *
    * @return `true` if this variable is potentially mutated somewhere in its scope
    */
-  bool get isPotentiallyMutated => false;
+  bool get isPotentiallyMutatedInScope => false;
 
   /**
    * Set whether this variable is const to correspond to the given value.
@@ -5835,7 +5869,7 @@
   BottomTypeImpl() : super(null, "<bottom>");
   bool operator ==(Object object) => identical(object, this);
   bool get isBottom => true;
-  bool isMoreSpecificThan(Type2 type) => true;
+  bool isMoreSpecificThan3(Type2 type, bool withDynamic) => true;
   bool isSubtypeOf(Type2 type) => true;
   bool isSupertypeOf(Type2 type) => false;
   BottomTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) => this;
@@ -5860,11 +5894,11 @@
   }
   bool operator ==(Object object) => object is DynamicTypeImpl;
   bool get isDynamic => true;
-  bool isMoreSpecificThan(Type2 type) {
+  bool isMoreSpecificThan3(Type2 type, bool withDynamic) {
     if (identical(this, type)) {
       return true;
     }
-    return false;
+    return withDynamic;
   }
   bool isSubtypeOf(Type2 type) => true;
   bool isSupertypeOf(Type2 type) => true;
@@ -6086,7 +6120,7 @@
     return element.hashCode;
   }
   bool isAssignableTo(Type2 type) => this.isSubtypeOf(type);
-  bool isMoreSpecificThan(Type2 type) {
+  bool isMoreSpecificThan3(Type2 type, bool withDynamic) {
     if (type == null) {
       return false;
     } else if (identical(this, type) || type.isDynamic || type.isDartCoreFunction || type.isObject) {
@@ -6110,7 +6144,7 @@
         return false;
       } else if (t.normalParameterTypes.length > 0) {
         for (int i = 0; i < tTypes.length; i++) {
-          if (!tTypes[i].isMoreSpecificThan(sTypes[i])) {
+          if (!tTypes[i].isMoreSpecificThan3(sTypes[i], withDynamic)) {
             return false;
           }
         }
@@ -6127,7 +6161,7 @@
         if (typeT == null) {
           return false;
         }
-        if (!typeT.isMoreSpecificThan(entryS.getValue())) {
+        if (!typeT.isMoreSpecificThan3(entryS.getValue(), withDynamic)) {
           return false;
         }
       }
@@ -6141,7 +6175,7 @@
       }
       if (tOpTypes.length == 0 && sOpTypes.length == 0) {
         for (int i = 0; i < sTypes.length; i++) {
-          if (!tTypes[i].isMoreSpecificThan(sTypes[i])) {
+          if (!tTypes[i].isMoreSpecificThan3(sTypes[i], withDynamic)) {
             return false;
           }
         }
@@ -6161,7 +6195,7 @@
           sAllTypes[i] = sOpTypes[j];
         }
         for (int i = 0; i < sAllTypes.length; i++) {
-          if (!tAllTypes[i].isMoreSpecificThan(sAllTypes[i])) {
+          if (!tAllTypes[i].isMoreSpecificThan3(sAllTypes[i], withDynamic)) {
             return false;
           }
         }
@@ -6169,7 +6203,7 @@
     }
     Type2 tRetType = t.returnType;
     Type2 sRetType = s.returnType;
-    return sRetType.isVoid || tRetType.isMoreSpecificThan(sRetType);
+    return sRetType.isVoid || tRetType.isMoreSpecificThan3(sRetType, withDynamic);
   }
   bool isSubtypeOf(Type2 type) {
     if (type == null) {
@@ -6698,35 +6732,40 @@
     return element.name == "Function" && element.library.isDartCore;
   }
   bool isDirectSupertypeOf(InterfaceType type) {
-    ClassElement i = element;
-    ClassElement j = type.element;
-    InterfaceType supertype = j.supertype;
+    InterfaceType i = this;
+    InterfaceType j = type;
+    ClassElement jElement = j.element;
+    InterfaceType supertype = jElement.supertype;
     if (supertype == null) {
       return false;
     }
-    ClassElement supertypeElement = supertype.element;
-    if (supertypeElement == i) {
+    List<Type2> jArgs = j.typeArguments;
+    List<Type2> jVars = jElement.type.typeArguments;
+    supertype = supertype.substitute2(jArgs, jVars);
+    if (supertype == i) {
       return true;
     }
-    for (InterfaceType interfaceType in j.interfaces) {
-      if (interfaceType.element == i) {
+    for (InterfaceType interfaceType in jElement.interfaces) {
+      interfaceType = interfaceType.substitute2(jArgs, jVars);
+      if (interfaceType == i) {
         return true;
       }
     }
-    for (InterfaceType mixinType in j.mixins) {
-      if (mixinType.element == i) {
+    for (InterfaceType mixinType in jElement.mixins) {
+      mixinType = mixinType.substitute2(jArgs, jVars);
+      if (mixinType == i) {
         return true;
       }
     }
     return false;
   }
-  bool isMoreSpecificThan(Type2 type) {
+  bool isMoreSpecificThan3(Type2 type, bool withDynamic) {
     if (identical(type, DynamicTypeImpl.instance)) {
       return true;
     } else if (type is! InterfaceType) {
       return false;
     }
-    return isMoreSpecificThan2(type as InterfaceType, new Set<ClassElement>());
+    return isMoreSpecificThan2(type as InterfaceType, new Set<ClassElement>(), withDynamic);
   }
   bool get isObject => element.supertype == null;
   bool isSubtypeOf(Type2 type) {
@@ -6901,7 +6940,7 @@
       builder.append(">");
     }
   }
-  bool isMoreSpecificThan2(InterfaceType s, Set<ClassElement> visitedClasses) {
+  bool isMoreSpecificThan2(InterfaceType s, Set<ClassElement> visitedClasses, bool withDynamic) {
     if (this == s) {
       return true;
     }
@@ -6917,7 +6956,7 @@
         return false;
       }
       for (int i = 0; i < tArguments.length; i++) {
-        if (!tArguments[i].isMoreSpecificThan(sArguments[i])) {
+        if (!tArguments[i].isMoreSpecificThan3(sArguments[i], withDynamic)) {
           return false;
         }
       }
@@ -6929,16 +6968,16 @@
     }
     javaSetAdd(visitedClasses, element);
     InterfaceType supertype = superclass;
-    if (supertype != null && ((supertype as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedClasses)) {
+    if (supertype != null && ((supertype as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedClasses, withDynamic)) {
       return true;
     }
     for (InterfaceType interfaceType in interfaces) {
-      if (((interfaceType as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedClasses)) {
+      if (((interfaceType as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedClasses, withDynamic)) {
         return true;
       }
     }
     for (InterfaceType mixinType in mixins) {
-      if (((mixinType as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedClasses)) {
+      if (((mixinType as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedClasses, withDynamic)) {
         return true;
       }
     }
@@ -6952,7 +6991,6 @@
       return false;
     }
     javaSetAdd(visitedClasses, elementT);
-    typeT = substitute2(_typeArguments, elementT.type.typeArguments);
     if (typeT == typeS) {
       return true;
     } else if (elementT == typeS.element) {
@@ -7052,7 +7090,8 @@
   bool get isBottom => false;
   bool get isDartCoreFunction => false;
   bool get isDynamic => false;
-  bool isMoreSpecificThan(Type2 type) => false;
+  bool isMoreSpecificThan(Type2 type) => isMoreSpecificThan3(type, false);
+  bool isMoreSpecificThan3(Type2 type, bool withDynamic) => false;
   bool get isObject => false;
   bool isSupertypeOf(Type2 type) => type.isSubtypeOf(this);
   bool get isVoid => false;
@@ -7118,7 +7157,7 @@
   bool operator ==(Object object) => object is TypeParameterTypeImpl && (element == ((object as TypeParameterTypeImpl)).element);
   TypeParameterElement get element => super.element as TypeParameterElement;
   int get hashCode => element.hashCode;
-  bool isMoreSpecificThan(Type2 s) {
+  bool isMoreSpecificThan3(Type2 s, bool withDynamic) {
     if (this == s) {
       return true;
     }
@@ -7128,9 +7167,9 @@
     if (s.isDynamic) {
       return true;
     }
-    return isMoreSpecificThan3(s, new Set<Type2>());
+    return isMoreSpecificThan4(s, new Set<Type2>(), withDynamic);
   }
-  bool isSubtypeOf(Type2 s) => isMoreSpecificThan(s);
+  bool isSubtypeOf(Type2 s) => isMoreSpecificThan3(s, true);
   Type2 substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) {
     int length = parameterTypes.length;
     for (int i = 0; i < length; i++) {
@@ -7140,7 +7179,7 @@
     }
     return this;
   }
-  bool isMoreSpecificThan3(Type2 s, Set<Type2> visitedTypes) {
+  bool isMoreSpecificThan4(Type2 s, Set<Type2> visitedTypes, bool withDynamic) {
     Type2 bound = element.bound;
     if (s == bound) {
       return true;
@@ -7157,9 +7196,9 @@
         return false;
       }
       javaSetAdd(visitedTypes, bound);
-      return boundTypeParameter.isMoreSpecificThan3(s, visitedTypes);
+      return boundTypeParameter.isMoreSpecificThan4(s, visitedTypes, withDynamic);
     }
-    return bound.isMoreSpecificThan(s);
+    return bound.isMoreSpecificThan3(s, withDynamic);
   }
 }
 /**
@@ -7732,6 +7771,15 @@
   bool isMoreSpecificThan(Type2 type);
 
   /**
+   * Return `true` if this type is more specific than the given type.
+   *
+   * @param type the type being compared with this type
+   * @param withDynamic `true` if "dynamic" should be considered as a subtype of any type
+   * @return `true` if this type is more specific than the given type
+   */
+  bool isMoreSpecificThan3(Type2 type, bool withDynamic);
+
+  /**
    * Return `true` if this type represents the type 'Object'.
    *
    * @return `true` if this type represents the type 'Object'
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 04d6d01..904598b 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -4054,7 +4054,7 @@
   AnalysisTask get nextTaskAnalysisTask {
     {
       bool hintsEnabled = _options.hint;
-      if (_incrementalAnalysisCache != null) {
+      if (_incrementalAnalysisCache != null && _incrementalAnalysisCache.hasWork()) {
         AnalysisTask task = new IncrementalAnalysisTask(this, _incrementalAnalysisCache);
         _incrementalAnalysisCache = null;
       }
@@ -4596,6 +4596,7 @@
       if (unit != null) {
         ChangeNoticeImpl notice = getNotice(task.source);
         notice.compilationUnit = unit;
+        _incrementalAnalysisCache = IncrementalAnalysisCache.cacheResult(task.cache, unit);
       }
     }
     return null;
@@ -4646,6 +4647,7 @@
           dartCopy.setValue(DartEntry.INCLUDED_PARTS, task.includedSources);
           ChangeNoticeImpl notice = getNotice(source);
           notice.setErrors(dartEntry.allErrors, lineInfo);
+          _incrementalAnalysisCache = IncrementalAnalysisCache.verifyStructure(_incrementalAnalysisCache, source, task.compilationUnit);
         } else {
           dartCopy.recordParseError();
         }
@@ -5588,6 +5590,21 @@
 class IncrementalAnalysisCache {
 
   /**
+   * Determine if the incremental analysis result can be cached for the next incremental analysis.
+   *
+   * @param cache the prior incremental analysis cache
+   * @param unit the incrementally updated compilation unit
+   * @return the cache used for incremental analysis or `null` if incremental analysis results
+   *         cannot be cached for the next incremental analysis
+   */
+  static IncrementalAnalysisCache cacheResult(IncrementalAnalysisCache cache, CompilationUnit unit) {
+    if (cache != null && unit != null) {
+      return new IncrementalAnalysisCache(cache.librarySource, cache.source, unit, cache.newContents, cache.newContents, 0, 0, 0);
+    }
+    return null;
+  }
+
+  /**
    * Determine if the cache should be cleared.
    *
    * @param cache the prior cache or `null` if none
@@ -5617,20 +5634,19 @@
    *         be performed
    */
   static IncrementalAnalysisCache update(IncrementalAnalysisCache cache, Source source, String oldContents, String newContents, int offset, int oldLength, int newLength, SourceEntry sourceEntry) {
-    if (cache == null || cache.source != source) {
-      if (sourceEntry is! DartEntryImpl) {
-        return null;
-      }
+    Source librarySource = null;
+    CompilationUnit unit = null;
+    if (sourceEntry is DartEntryImpl) {
       DartEntryImpl dartEntry = sourceEntry as DartEntryImpl;
       List<Source> librarySources = dartEntry.librariesContaining;
-      if (librarySources.length != 1) {
-        return null;
+      if (librarySources.length == 1) {
+        librarySource = librarySources[0];
+        if (librarySource != null) {
+          unit = dartEntry.getValue2(DartEntry.RESOLVED_UNIT, librarySource);
+        }
       }
-      Source librarySource = librarySources[0];
-      if (librarySource == null) {
-        return null;
-      }
-      CompilationUnit unit = dartEntry.getValue2(DartEntry.RESOLVED_UNIT, librarySource);
+    }
+    if (cache == null || cache.source != source || unit != null) {
       if (unit == null) {
         return null;
       }
@@ -5642,11 +5658,36 @@
       }
       return new IncrementalAnalysisCache(librarySource, source, unit, oldContents, newContents, offset, oldLength, newLength);
     }
-    if (cache.offset > offset || offset > cache.offset + cache.newLength) {
-      return null;
+    if (cache.oldLength == 0 && cache.newLength == 0) {
+      cache.offset = offset;
+      cache.oldLength = oldLength;
+      cache.newLength = newLength;
+    } else {
+      if (cache.offset > offset || offset > cache.offset + cache.newLength) {
+        return null;
+      }
+      cache.newLength += newLength - oldLength;
     }
     cache.newContents = newContents;
-    cache.newLength += newLength - oldLength;
+    return cache;
+  }
+
+  /**
+   * Verify that the incrementally parsed and resolved unit in the incremental cache is structurally
+   * equivalent to the fully parsed unit.
+   *
+   * @param cache the prior cache or `null` if none
+   * @param source the source of the compilation unit that was parsed (not `null`)
+   * @param unit the compilation unit that was just parsed
+   * @return the cache used for incremental analysis or `null` if incremental analysis results
+   *         cannot be cached for the next incremental analysis
+   */
+  static IncrementalAnalysisCache verifyStructure(IncrementalAnalysisCache cache, Source source, CompilationUnit unit) {
+    if (cache != null && unit != null && cache.source == source) {
+      if (!ASTComparator.equals3(cache.resolvedUnit, unit)) {
+        return null;
+      }
+    }
     return cache;
   }
   Source librarySource;
@@ -5667,6 +5708,13 @@
     this.oldLength = oldLength;
     this.newLength = newLength;
   }
+
+  /**
+   * Determine if the cache contains source changes that need to be analyzed
+   *
+   * @return `true` if the cache contains changes to be analyzed, else `false`
+   */
+  bool hasWork() => oldLength > 0 && newLength > 0;
 }
 /**
  * Instances of the class `InstrumentedAnalysisContextImpl` implement an
@@ -6841,7 +6889,7 @@
   /**
    * The information used to perform incremental analysis.
    */
-  IncrementalAnalysisCache _cache;
+  IncrementalAnalysisCache cache;
 
   /**
    * The compilation unit that was produced by incrementally updating the existing unit.
@@ -6855,7 +6903,7 @@
    * @param cache the incremental analysis cache used to perform the analysis
    */
   IncrementalAnalysisTask(InternalAnalysisContext context, IncrementalAnalysisCache cache) : super(context) {
-    this._cache = cache;
+    this.cache = cache;
   }
   accept(AnalysisTaskVisitor visitor) => visitor.visitIncrementalAnalysisTask(this);
 
@@ -6864,13 +6912,13 @@
    *
    * @return the source
    */
-  Source get source => _cache != null ? _cache.source : null;
-  String get taskDescription => "incremental analysis ${(_cache != null ? _cache.source : "null")}";
+  Source get source => cache != null ? cache.source : null;
+  String get taskDescription => "incremental analysis ${(cache != null ? cache.source : "null")}";
   void internalPerform() {
-    if (_cache == null) {
+    if (cache == null) {
       return;
     }
-    compilationUnit = _cache.resolvedUnit;
+    compilationUnit = cache.resolvedUnit;
   }
 }
 /**
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index c1c580a..81d6249 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -1749,28 +1749,22 @@
   static final CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = new CompileTimeErrorCode.con1('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 121, "Constant factory constructor cannot delegate to a non-constant constructor");
 
   /**
-   * 13.3 Local Variable Declaration: It is a compile-time error if <i>e</i> refers to the name
-   * <i>v</i> or the name <i>v=</i>.
-   */
-  static final CompileTimeErrorCode REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER = new CompileTimeErrorCode.con1('REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER', 122, "The name '%s' cannot be referenced in the initializer of a variable with the same name");
-
-  /**
    * 5 Variables: A local variable may only be referenced at a source code location that is after
    * its initializer, if any, is complete, or a compile-time error occurs.
    */
-  static final CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = new CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 123, "Local variables cannot be referenced before they are declared");
+  static final CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = new CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 122, "Local variables cannot be referenced before they are declared");
 
   /**
    * 12.8.1 Rethrow: It is a compile-time error if an expression of the form <i>rethrow;</i> is not
    * enclosed within a on-catch clause.
    */
-  static final CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = new CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 124, "rethrow must be inside of a catch clause");
+  static final CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = new CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 123, "rethrow must be inside of a catch clause");
 
   /**
    * 13.11 Return: It is a compile-time error if a return statement of the form <i>return e;</i>
    * appears in a generative constructor.
    */
-  static final CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = new CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 125, "Constructors cannot return a value");
+  static final CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = new CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 124, "Constructors cannot return a value");
 
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
@@ -1780,19 +1774,19 @@
    * initializer list, in class Object, in a factory constructor, or in a static method or variable
    * initializer.
    */
-  static final CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = new CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 126, "Invalid context for 'super' invocation");
+  static final CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = new CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 125, "Invalid context for 'super' invocation");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
    * only action is to invoke another generative constructor.
    */
-  static final CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = new CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 127, "The redirecting constructor cannot have a 'super' initializer");
+  static final CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = new CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 126, "The redirecting constructor cannot have a 'super' initializer");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
    * error if a generative constructor of class Object includes a superinitializer.
    */
-  static final CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = new CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 128, "");
+  static final CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = new CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 127, "");
 
   /**
    * 12.11 Instance Creation: It is a static type warning if any of the type arguments to a
@@ -1811,19 +1805,19 @@
    * @param boundingTypeName the name of the bounding type
    * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
    */
-  static final CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = new CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 129, "'%s' does not extend '%s'");
+  static final CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = new CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 128, "'%s' does not extend '%s'");
 
   /**
    * 15.3.1 Typedef: Any self reference, either directly, or recursively via another typedef, is a
    * compile time error.
    */
-  static final CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = new CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 130, "Type alias cannot reference itself directly or recursively via another typedef");
+  static final CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = new CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 129, "Type alias cannot reference itself directly or recursively via another typedef");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
    * scope, optionally followed by type arguments.
    */
-  static final CompileTimeErrorCode UNDEFINED_CLASS = new CompileTimeErrorCode.con1('UNDEFINED_CLASS', 131, "Undefined class '%s'");
+  static final CompileTimeErrorCode UNDEFINED_CLASS = new CompileTimeErrorCode.con1('UNDEFINED_CLASS', 130, "Undefined class '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1831,7 +1825,7 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = new CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 132, "The class '%s' does not have a generative constructor '%s'");
+  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = new CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 131, "The class '%s' does not have a generative constructor '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1839,7 +1833,7 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = new CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 133, "The class '%s' does not have a default generative constructor");
+  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = new CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 132, "The class '%s' does not have a default generative constructor");
 
   /**
    * 12.14.3 Unqualified Invocation: If there exists a lexically visible declaration named
@@ -1849,7 +1843,7 @@
    *
    * @param methodName the name of the method that is undefined
    */
-  static final CompileTimeErrorCode UNDEFINED_FUNCTION = new CompileTimeErrorCode.con1('UNDEFINED_FUNCTION', 134, "The function '%s' is not defined");
+  static final CompileTimeErrorCode UNDEFINED_FUNCTION = new CompileTimeErrorCode.con1('UNDEFINED_FUNCTION', 133, "The function '%s' is not defined");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -1861,7 +1855,7 @@
    *
    * @param name the name of the requested named parameter
    */
-  static final CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = new CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 135, "The named parameter '%s' is not defined");
+  static final CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = new CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 134, "The named parameter '%s' is not defined");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1876,7 +1870,7 @@
    * @param uri the URI pointing to a non-existent file
    * @see #INVALID_URI
    */
-  static final CompileTimeErrorCode URI_DOES_NOT_EXIST = new CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 136, "Target of URI does not exist: '%s'");
+  static final CompileTimeErrorCode URI_DOES_NOT_EXIST = new CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 135, "Target of URI does not exist: '%s'");
 
   /**
    * 14.1 Imports: It is a compile-time error if <i>x</i> is not a compile-time constant, or if
@@ -1888,7 +1882,7 @@
    * 14.5 URIs: It is a compile-time error if the string literal <i>x</i> that describes a URI is
    * not a compile-time constant, or if <i>x</i> involves string interpolation.
    */
-  static final CompileTimeErrorCode URI_WITH_INTERPOLATION = new CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 137, "URIs cannot use string interpolation");
+  static final CompileTimeErrorCode URI_WITH_INTERPOLATION = new CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 136, "URIs cannot use string interpolation");
 
   /**
    * 7.1.1 Operators: It is a compile-time error if the arity of the user-declared operator []= is
@@ -1901,7 +1895,7 @@
    * @param expectedNumberOfParameters the number of parameters expected
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = new CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 138, "Operator '%s' should declare exactly %d parameter(s), but %d found");
+  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = new CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 137, "Operator '%s' should declare exactly %d parameter(s), but %d found");
 
   /**
    * 7.1.1 Operators: It is a compile time error if the arity of the user-declared operator - is not
@@ -1909,13 +1903,13 @@
    *
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = new CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 139, "Operator '-' should declare 0 or 1 parameter, but %d found");
+  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = new CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 138, "Operator '-' should declare 0 or 1 parameter, but %d found");
 
   /**
    * 7.3 Setters: It is a compile-time error if a setter's formal parameter list does not include
    * exactly one required formal parameter <i>p</i>.
    */
-  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = new CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 140, "Setters should declare exactly one required parameter");
+  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = new CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 139, "Setters should declare exactly one required parameter");
   static final List<CompileTimeErrorCode> values = [
       AMBIGUOUS_EXPORT,
       ARGUMENT_DEFINITION_TEST_NON_PARAMETER,
@@ -2039,7 +2033,6 @@
       REDIRECT_TO_MISSING_CONSTRUCTOR,
       REDIRECT_TO_NON_CLASS,
       REDIRECT_TO_NON_CONST_CONSTRUCTOR,
-      REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER,
       REFERENCED_BEFORE_DECLARATION,
       RETHROW_OUTSIDE_CATCH,
       RETURN_IN_GENERATIVE_CONSTRUCTOR,
diff --git a/pkg/analyzer/lib/src/generated/java_core.dart b/pkg/analyzer/lib/src/generated/java_core.dart
index 55b7cd6..46fdaae 100644
--- a/pkg/analyzer/lib/src/generated/java_core.dart
+++ b/pkg/analyzer/lib/src/generated/java_core.dart
@@ -40,6 +40,13 @@
   if (oTypeName == "${tTypeName}Impl") {
     return true;
   }
+  if (tTypeName == "FormalParameter") {
+    return
+        oTypeName == "DefaultFormalParameter" ||
+        oTypeName == "FieldNormalParameter" ||
+        oTypeName == "FunctionTypedFormalParameter" ||
+        oTypeName == "SimpleFormalParameter";
+  }
   if (tTypeName == "MethodElement") {
     if (oTypeName == "MethodMember") {
       return true;
@@ -272,7 +279,7 @@
 }
 
 class RuntimeException extends JavaException {
-  RuntimeException([String message = "", Exception cause = null]) :
+  RuntimeException({String message: "", Exception cause: null}) :
     super(message, cause);
 }
 
@@ -436,6 +443,10 @@
   return a || b;
 }
 
+bool javaBooleanAnd(bool a, bool b) {
+  return a && b;
+}
+
 class JavaStringBuilder {
   StringBuffer sb = new StringBuffer();
   String toString() => sb.toString();
diff --git a/pkg/analyzer/lib/src/generated/java_junit.dart b/pkg/analyzer/lib/src/generated/java_junit.dart
index 2c13338..81b4be0 100644
--- a/pkg/analyzer/lib/src/generated/java_junit.dart
+++ b/pkg/analyzer/lib/src/generated/java_junit.dart
@@ -43,6 +43,9 @@
   static void assertSameMsg(String msg, expected, actual) {
     expect(actual, sameMsg(msg, expected));
   }
+  static void assertNotSame(expected, actual) {
+    expect(actual, notSame(expected));
+  }
 }
 
 runJUnitTest(testInstance, Function testFunction) {
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index bfd461d..10a1a2c 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -10,6 +10,7 @@
 import 'ast.dart';
 import 'utilities_dart.dart';
 import 'engine.dart' show AnalysisEngine;
+import 'utilities_collection.dart' show TokenMap;
 /**
  * Instances of the class `CommentAndMetadata` implement a simple data-holder for a method
  * that needs to return multiple values.
@@ -143,6 +144,1035 @@
   }
 }
 /**
+ * Instances of the class `IncrementalParseDispatcher` implement a dispatcher that will invoke
+ * the right parse method when re-parsing a specified child of the visited node. All of the methods
+ * in this class assume that the parser is positioned to parse the replacement for the node. All of
+ * the methods will throw an [IncrementalParseException] if the node could not be parsed for
+ * some reason.
+ */
+class IncrementalParseDispatcher implements ASTVisitor<ASTNode> {
+
+  /**
+   * The parser used to parse the replacement for the node.
+   */
+  Parser _parser;
+
+  /**
+   * The node that is to be replaced.
+   */
+  ASTNode _oldNode;
+
+  /**
+   * Initialize a newly created dispatcher to parse a single node that will replace the given node.
+   *
+   * @param parser the parser used to parse the replacement for the node
+   * @param oldNode the node that is to be replaced
+   */
+  IncrementalParseDispatcher(Parser parser, ASTNode oldNode) {
+    this._parser = parser;
+    this._oldNode = oldNode;
+  }
+  ASTNode visitAdjacentStrings(AdjacentStrings node) {
+    if (node.strings.contains(_oldNode)) {
+      return _parser.parseStringLiteral();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitAnnotation(Annotation node) {
+    if (identical(_oldNode, node.name)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.constructorName)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.arguments)) {
+      return _parser.parseArgumentList();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
+    if (identical(_oldNode, node.identifier)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitArgumentList(ArgumentList node) {
+    if (node.arguments.contains(_oldNode)) {
+      return _parser.parseArgument();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitAsExpression(AsExpression node) {
+    if (identical(_oldNode, node.expression)) {
+      return _parser.parseBitwiseOrExpression();
+    } else if (identical(_oldNode, node.type)) {
+      return _parser.parseTypeName();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitAssertStatement(AssertStatement node) {
+    if (identical(_oldNode, node.condition)) {
+      return _parser.parseExpression2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitAssignmentExpression(AssignmentExpression node) {
+    if (identical(_oldNode, node.leftHandSide)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.rightHandSide)) {
+      if (isCascadeAllowed(node)) {
+        return _parser.parseExpression2();
+      }
+      return _parser.parseExpressionWithoutCascade();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitBinaryExpression(BinaryExpression node) {
+    if (identical(_oldNode, node.leftOperand)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.rightOperand)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitBlock(Block node) {
+    if (node.statements.contains(_oldNode)) {
+      return _parser.parseStatement2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitBlockFunctionBody(BlockFunctionBody node) {
+    if (identical(_oldNode, node.block)) {
+      return _parser.parseBlock();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitBooleanLiteral(BooleanLiteral node) => notAChild(node);
+  ASTNode visitBreakStatement(BreakStatement node) {
+    if (identical(_oldNode, node.label)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitCascadeExpression(CascadeExpression node) {
+    if (identical(_oldNode, node.target)) {
+      return _parser.parseConditionalExpression();
+    } else if (node.cascadeSections.contains(_oldNode)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitCatchClause(CatchClause node) {
+    if (identical(_oldNode, node.exceptionType)) {
+      return _parser.parseTypeName();
+    } else if (identical(_oldNode, node.exceptionParameter)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.stackTraceParameter)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.body)) {
+      return _parser.parseBlock();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitClassDeclaration(ClassDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.typeParameters)) {
+      return _parser.parseTypeParameterList();
+    } else if (identical(_oldNode, node.extendsClause)) {
+      return _parser.parseExtendsClause();
+    } else if (identical(_oldNode, node.withClause)) {
+      return _parser.parseWithClause();
+    } else if (identical(_oldNode, node.implementsClause)) {
+      return _parser.parseImplementsClause();
+    } else if (node.members.contains(_oldNode)) {
+      return _parser.parseClassMember(node.name.name);
+    }
+    return notAChild(node);
+  }
+  ASTNode visitClassTypeAlias(ClassTypeAlias node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.typeParameters)) {
+      return _parser.parseTypeParameterList();
+    } else if (identical(_oldNode, node.superclass)) {
+      return _parser.parseTypeName();
+    } else if (identical(_oldNode, node.withClause)) {
+      return _parser.parseWithClause();
+    } else if (identical(_oldNode, node.implementsClause)) {
+      return _parser.parseImplementsClause();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitComment(Comment node) {
+    throw new InsufficientContextException();
+  }
+  ASTNode visitCommentReference(CommentReference node) {
+    if (identical(_oldNode, node.identifier)) {
+      return _parser.parsePrefixedIdentifier();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitCompilationUnit(CompilationUnit node) {
+    throw new InsufficientContextException();
+  }
+  ASTNode visitConditionalExpression(ConditionalExpression node) {
+    if (identical(_oldNode, node.condition)) {
+      return _parser.parseLogicalOrExpression();
+    } else if (identical(_oldNode, node.thenExpression)) {
+      return _parser.parseExpressionWithoutCascade();
+    } else if (identical(_oldNode, node.elseExpression)) {
+      return _parser.parseExpressionWithoutCascade();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitConstructorDeclaration(ConstructorDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.returnType)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.name)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.parameters)) {
+      return _parser.parseFormalParameterList();
+    } else if (identical(_oldNode, node.redirectedConstructor)) {
+      throw new InsufficientContextException();
+    } else if (node.initializers.contains(_oldNode)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.body)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    if (identical(_oldNode, node.fieldName)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.expression)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitConstructorName(ConstructorName node) {
+    if (identical(_oldNode, node.type)) {
+      return _parser.parseTypeName();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitContinueStatement(ContinueStatement node) {
+    if (identical(_oldNode, node.label)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitDeclaredIdentifier(DeclaredIdentifier node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.type)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.identifier)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitDefaultFormalParameter(DefaultFormalParameter node) {
+    if (identical(_oldNode, node.parameter)) {
+      return _parser.parseNormalFormalParameter();
+    } else if (identical(_oldNode, node.defaultValue)) {
+      return _parser.parseExpression2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitDoStatement(DoStatement node) {
+    if (identical(_oldNode, node.body)) {
+      return _parser.parseStatement2();
+    } else if (identical(_oldNode, node.condition)) {
+      return _parser.parseExpression2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitDoubleLiteral(DoubleLiteral node) => notAChild(node);
+  ASTNode visitEmptyFunctionBody(EmptyFunctionBody node) => notAChild(node);
+  ASTNode visitEmptyStatement(EmptyStatement node) => notAChild(node);
+  ASTNode visitExportDirective(ExportDirective node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.uri)) {
+      return _parser.parseStringLiteral();
+    } else if (node.combinators.contains(_oldNode)) {
+      throw new IncrementalParseException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    if (identical(_oldNode, node.expression)) {
+      return _parser.parseExpression2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitExpressionStatement(ExpressionStatement node) {
+    if (identical(_oldNode, node.expression)) {
+      return _parser.parseExpression2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitExtendsClause(ExtendsClause node) {
+    if (identical(_oldNode, node.superclass)) {
+      return _parser.parseTypeName();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitFieldDeclaration(FieldDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.fields)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitFieldFormalParameter(FieldFormalParameter node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.type)) {
+      return _parser.parseTypeName();
+    } else if (identical(_oldNode, node.identifier)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.parameters)) {
+      return _parser.parseFormalParameterList();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitForEachStatement(ForEachStatement node) {
+    if (identical(_oldNode, node.loopVariable)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.identifier)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.body)) {
+      return _parser.parseStatement2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitFormalParameterList(FormalParameterList node) {
+    throw new InsufficientContextException();
+  }
+  ASTNode visitForStatement(ForStatement node) {
+    if (identical(_oldNode, node.variables)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.initialization)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.condition)) {
+      return _parser.parseExpression2();
+    } else if (node.updaters.contains(_oldNode)) {
+      return _parser.parseExpression2();
+    } else if (identical(_oldNode, node.body)) {
+      return _parser.parseStatement2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitFunctionDeclaration(FunctionDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.returnType)) {
+      return _parser.parseReturnType();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.functionExpression)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+    if (identical(_oldNode, node.functionDeclaration)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitFunctionExpression(FunctionExpression node) {
+    if (identical(_oldNode, node.parameters)) {
+      return _parser.parseFormalParameterList();
+    } else if (identical(_oldNode, node.body)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    if (identical(_oldNode, node.function)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.argumentList)) {
+      return _parser.parseArgumentList();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitFunctionTypeAlias(FunctionTypeAlias node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.returnType)) {
+      return _parser.parseReturnType();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.typeParameters)) {
+      return _parser.parseTypeParameterList();
+    } else if (identical(_oldNode, node.parameters)) {
+      return _parser.parseFormalParameterList();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.returnType)) {
+      return _parser.parseReturnType();
+    } else if (identical(_oldNode, node.identifier)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.parameters)) {
+      return _parser.parseFormalParameterList();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitHideCombinator(HideCombinator node) {
+    if (node.hiddenNames.contains(_oldNode)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitIfStatement(IfStatement node) {
+    if (identical(_oldNode, node.condition)) {
+      return _parser.parseExpression2();
+    } else if (identical(_oldNode, node.thenStatement)) {
+      return _parser.parseStatement2();
+    } else if (identical(_oldNode, node.elseStatement)) {
+      return _parser.parseStatement2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitImplementsClause(ImplementsClause node) {
+    if (node.interfaces.contains(node)) {
+      return _parser.parseTypeName();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitImportDirective(ImportDirective node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.uri)) {
+      return _parser.parseStringLiteral();
+    } else if (identical(_oldNode, node.prefix)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (node.combinators.contains(_oldNode)) {
+      throw new IncrementalParseException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitIndexExpression(IndexExpression node) {
+    if (identical(_oldNode, node.target)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.index)) {
+      return _parser.parseExpression2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitInstanceCreationExpression(InstanceCreationExpression node) {
+    if (identical(_oldNode, node.constructorName)) {
+      return _parser.parseConstructorName();
+    } else if (identical(_oldNode, node.argumentList)) {
+      return _parser.parseArgumentList();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitIntegerLiteral(IntegerLiteral node) => notAChild(node);
+  ASTNode visitInterpolationExpression(InterpolationExpression node) {
+    if (identical(_oldNode, node.expression)) {
+      if (node.leftBracket == null) {
+        throw new InsufficientContextException();
+      }
+      return _parser.parseExpression2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitInterpolationString(InterpolationString node) {
+    throw new InsufficientContextException();
+  }
+  ASTNode visitIsExpression(IsExpression node) {
+    if (identical(_oldNode, node.expression)) {
+      return _parser.parseBitwiseOrExpression();
+    } else if (identical(_oldNode, node.type)) {
+      return _parser.parseTypeName();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitLabel(Label node) {
+    if (identical(_oldNode, node.label)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitLabeledStatement(LabeledStatement node) {
+    if (node.labels.contains(_oldNode)) {
+      return _parser.parseLabel();
+    } else if (identical(_oldNode, node.statement)) {
+      return _parser.parseStatement2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitLibraryDirective(LibraryDirective node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseLibraryIdentifier();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitLibraryIdentifier(LibraryIdentifier node) {
+    if (node.components.contains(_oldNode)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitListLiteral(ListLiteral node) {
+    if (identical(_oldNode, node.typeArguments)) {
+      return _parser.parseTypeArgumentList();
+    } else if (node.elements.contains(_oldNode)) {
+      return _parser.parseExpression2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitMapLiteral(MapLiteral node) {
+    if (identical(_oldNode, node.typeArguments)) {
+      return _parser.parseTypeArgumentList();
+    } else if (node.entries.contains(_oldNode)) {
+      return _parser.parseMapLiteralEntry();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitMapLiteralEntry(MapLiteralEntry node) {
+    if (identical(_oldNode, node.key)) {
+      return _parser.parseExpression2();
+    } else if (identical(_oldNode, node.value)) {
+      return _parser.parseExpression2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitMethodDeclaration(MethodDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.returnType)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.name)) {
+      if (node.operatorKeyword != null) {
+        throw new InsufficientContextException();
+      }
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.body)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitMethodInvocation(MethodInvocation node) {
+    if (identical(_oldNode, node.target)) {
+      throw new IncrementalParseException();
+    } else if (identical(_oldNode, node.methodName)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.argumentList)) {
+      return _parser.parseArgumentList();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitNamedExpression(NamedExpression node) {
+    if (identical(_oldNode, node.name)) {
+      return _parser.parseLabel();
+    } else if (identical(_oldNode, node.expression)) {
+      return _parser.parseExpression2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitNativeClause(NativeClause node) {
+    if (identical(_oldNode, node.name)) {
+      return _parser.parseStringLiteral();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitNativeFunctionBody(NativeFunctionBody node) {
+    if (identical(_oldNode, node.stringLiteral)) {
+      return _parser.parseStringLiteral();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitNullLiteral(NullLiteral node) => notAChild(node);
+  ASTNode visitParenthesizedExpression(ParenthesizedExpression node) {
+    if (identical(_oldNode, node.expression)) {
+      return _parser.parseExpression2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitPartDirective(PartDirective node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.uri)) {
+      return _parser.parseStringLiteral();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitPartOfDirective(PartOfDirective node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.libraryName)) {
+      return _parser.parseLibraryIdentifier();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitPostfixExpression(PostfixExpression node) {
+    if (identical(_oldNode, node.operand)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitPrefixedIdentifier(PrefixedIdentifier node) {
+    if (identical(_oldNode, node.prefix)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.identifier)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitPrefixExpression(PrefixExpression node) {
+    if (identical(_oldNode, node.operand)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitPropertyAccess(PropertyAccess node) {
+    if (identical(_oldNode, node.target)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.propertyName)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
+    if (identical(_oldNode, node.constructorName)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.argumentList)) {
+      return _parser.parseArgumentList();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitRethrowExpression(RethrowExpression node) => notAChild(node);
+  ASTNode visitReturnStatement(ReturnStatement node) {
+    if (identical(_oldNode, node.expression)) {
+      return _parser.parseExpression2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitScriptTag(ScriptTag node) => notAChild(node);
+  ASTNode visitShowCombinator(ShowCombinator node) {
+    if (node.shownNames.contains(_oldNode)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitSimpleFormalParameter(SimpleFormalParameter node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.type)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.identifier)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitSimpleIdentifier(SimpleIdentifier node) => notAChild(node);
+  ASTNode visitSimpleStringLiteral(SimpleStringLiteral node) => notAChild(node);
+  ASTNode visitStringInterpolation(StringInterpolation node) {
+    if (node.elements.contains(_oldNode)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    if (identical(_oldNode, node.constructorName)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.argumentList)) {
+      return _parser.parseArgumentList();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitSuperExpression(SuperExpression node) => notAChild(node);
+  ASTNode visitSwitchCase(SwitchCase node) {
+    if (node.labels.contains(_oldNode)) {
+      return _parser.parseLabel();
+    } else if (identical(_oldNode, node.expression)) {
+      return _parser.parseExpression2();
+    } else if (node.statements.contains(_oldNode)) {
+      return _parser.parseStatement2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitSwitchDefault(SwitchDefault node) {
+    if (node.labels.contains(_oldNode)) {
+      return _parser.parseLabel();
+    } else if (node.statements.contains(_oldNode)) {
+      return _parser.parseStatement2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitSwitchStatement(SwitchStatement node) {
+    if (identical(_oldNode, node.expression)) {
+      return _parser.parseExpression2();
+    } else if (node.members.contains(_oldNode)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitSymbolLiteral(SymbolLiteral node) => notAChild(node);
+  ASTNode visitThisExpression(ThisExpression node) => notAChild(node);
+  ASTNode visitThrowExpression(ThrowExpression node) {
+    if (identical(_oldNode, node.expression)) {
+      if (isCascadeAllowed2(node)) {
+        return _parser.parseExpression2();
+      }
+      return _parser.parseExpressionWithoutCascade();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.variables)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitTryStatement(TryStatement node) {
+    if (identical(_oldNode, node.body)) {
+      return _parser.parseBlock();
+    } else if (node.catchClauses.contains(_oldNode)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.finallyBlock)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitTypeArgumentList(TypeArgumentList node) {
+    if (node.arguments.contains(_oldNode)) {
+      return _parser.parseTypeName();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitTypeName(TypeName node) {
+    if (identical(_oldNode, node.name)) {
+      return _parser.parsePrefixedIdentifier();
+    } else if (identical(_oldNode, node.typeArguments)) {
+      return _parser.parseTypeArgumentList();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitTypeParameter(TypeParameter node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.bound)) {
+      return _parser.parseTypeName();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitTypeParameterList(TypeParameterList node) {
+    if (node.typeParameters.contains(node)) {
+      return _parser.parseTypeParameter();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitVariableDeclaration(VariableDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.name)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.initializer)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitVariableDeclarationList(VariableDeclarationList node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (node.variables.contains(_oldNode)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    if (identical(_oldNode, node.variables)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitWhileStatement(WhileStatement node) {
+    if (identical(_oldNode, node.condition)) {
+      return _parser.parseExpression2();
+    } else if (identical(_oldNode, node.body)) {
+      return _parser.parseStatement2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitWithClause(WithClause node) {
+    if (node.mixinTypes.contains(node)) {
+      return _parser.parseTypeName();
+    }
+    return notAChild(node);
+  }
+
+  /**
+   * Return `true` if the given assignment expression can have a cascade expression on the
+   * right-hand side.
+   *
+   * @param node the assignment expression being tested
+   * @return `true` if the right-hand side can be a cascade expression
+   */
+  bool isCascadeAllowed(AssignmentExpression node) {
+    throw new InsufficientContextException();
+  }
+
+  /**
+   * Return `true` if the given throw expression can have a cascade expression.
+   *
+   * @param node the throw expression being tested
+   * @return `true` if the expression can be a cascade expression
+   */
+  bool isCascadeAllowed2(ThrowExpression node) {
+    throw new InsufficientContextException();
+  }
+
+  /**
+   * Throw an exception indicating that the visited node was not the parent of the node to be
+   * replaced.
+   *
+   * @param visitedNode the visited node that should have been the parent of the node to be replaced
+   */
+  ASTNode notAChild(ASTNode visitedNode) {
+    throw new IncrementalParseException.con1("Internal error: the visited node (a ${visitedNode.runtimeType.toString()}) was not the parent of the node to be replaced (a ${_oldNode.runtimeType.toString()})");
+  }
+}
+/**
+ * Instances of the class `IncrementalParseException` represent an exception that occurred
+ * while attempting to parse a replacement for a specified node in an existing AST structure.
+ */
+class IncrementalParseException extends RuntimeException {
+
+  /**
+   * Initialize a newly created exception to have no message and to be its own cause.
+   */
+  IncrementalParseException() : super();
+
+  /**
+   * Initialize a newly created exception to have the given message and to be its own cause.
+   *
+   * @param message the message describing the reason for the exception
+   */
+  IncrementalParseException.con1(String message) : super(message: message);
+
+  /**
+   * Initialize a newly created exception to have no message and to have the given cause.
+   *
+   * @param cause the exception that caused this exception
+   */
+  IncrementalParseException.con2(Exception cause) : super(cause: cause);
+}
+/**
+ * Instances of the class `IncrementalParser` re-parse a single AST structure within a larger
+ * AST structure.
+ */
+class IncrementalParser {
+
+  /**
+   * The source being parsed.
+   */
+  Source _source;
+
+  /**
+   * A map from old tokens to new tokens used during the cloning process.
+   */
+  TokenMap _tokenMap;
+
+  /**
+   * The error listener that will be informed of any errors that are found during the parse.
+   */
+  AnalysisErrorListener _errorListener;
+
+  /**
+   * Initialize a newly created incremental parser to parse a portion of the content of the given
+   * source.
+   *
+   * @param source the source being parsed
+   * @param tokenMap a map from old tokens to new tokens used during the cloning process
+   * @param errorListener the error listener that will be informed of any errors that are found
+   *          during the parse
+   */
+  IncrementalParser(Source source, TokenMap tokenMap, AnalysisErrorListener errorListener) {
+    this._source = source;
+    this._tokenMap = tokenMap;
+    this._errorListener = errorListener;
+  }
+
+  /**
+   * Given a range of tokens that were re-scanned, re-parse the minimimum number of tokens to
+   * produce a consistent AST structure. The range is represented by the first and last tokens in
+   * the range. The tokens are assumed to be contained in the same token stream.
+   *
+   * @param firstToken the first token in the range of tokens that were re-scanned or `null`
+   *          if no new tokens were inserted
+   * @param lastToken the last token in the range of tokens that were re-scanned or `null` if
+   *          no new tokens were inserted
+   * @param originalStart the offset in the original source of the first character that was modified
+   * @param originalEnd the offset in the original source of the last character that was modified
+   */
+  ASTNode reparse(ASTNode originalStructure, Token firstToken, Token lastToken, int originalStart, int originalEnd) {
+    ASTNode oldNode = null;
+    ASTNode newNode = null;
+    if (firstToken != null) {
+      if (originalEnd < originalStart) {
+        oldNode = new NodeLocator.con1(originalStart).searchWithin(originalStructure);
+      } else {
+        oldNode = new NodeLocator.con2(originalStart, originalEnd).searchWithin(originalStructure);
+      }
+      int originalOffset = oldNode.offset;
+      Token parseToken = findTokenAt(firstToken, originalOffset);
+      if (parseToken == null) {
+        return null;
+      }
+      Parser parser = new Parser(_source, _errorListener);
+      parser.currentToken = parseToken;
+      while (newNode == null) {
+        ASTNode parent = oldNode.parent;
+        if (parent == null) {
+          parseToken = findFirstToken(parseToken);
+          parser.currentToken = parseToken;
+          return parser.parseCompilationUnit2() as ASTNode;
+        }
+        try {
+          IncrementalParseDispatcher dispatcher = new IncrementalParseDispatcher(parser, oldNode);
+          newNode = parent.accept(dispatcher);
+        } on InsufficientContextException catch (exception) {
+          oldNode = parent;
+          originalOffset = oldNode.offset;
+          parseToken = findTokenAt(parseToken, originalOffset);
+          parser.currentToken = parseToken;
+        } on JavaException catch (exception) {
+          return null;
+        }
+      }
+      if (newNode.offset != originalOffset) {
+        return null;
+      }
+      if (identical(oldNode, originalStructure)) {
+        return newNode as ASTNode;
+      }
+      ResolutionCopier.copyResolutionData(oldNode, newNode);
+    }
+    IncrementalASTCloner cloner = new IncrementalASTCloner(oldNode, newNode, _tokenMap);
+    return originalStructure.accept(cloner) as ASTNode;
+  }
+
+  /**
+   * Return the first (non-EOF) token in the token stream containing the given token.
+   *
+   * @param firstToken the token from which the search is to begin
+   * @return the first token in the token stream containing the given token
+   */
+  Token findFirstToken(Token firstToken) {
+    while (firstToken.type != TokenType.EOF) {
+      firstToken = firstToken.previous;
+    }
+    return firstToken.next;
+  }
+
+  /**
+   * Find the token at or before the given token with the given offset, or `null` if there is
+   * no such token.
+   *
+   * @param firstToken the token from which the search is to begin
+   * @param offset the offset of the token to be returned
+   * @return the token with the given offset
+   */
+  Token findTokenAt(Token firstToken, int offset) {
+    while (firstToken.offset > offset && firstToken.type != TokenType.EOF) {
+      firstToken = firstToken.previous;
+    }
+    if (firstToken.offset == offset) {
+      return firstToken;
+    }
+    return null;
+  }
+}
+/**
+ * Instances of the class `InsufficientContextException` represent a situation in which an AST
+ * node cannot be re-parsed because there is not enough context to know how to re-parse the node.
+ * Clients can attempt to re-parse the parent of the node.
+ */
+class InsufficientContextException extends IncrementalParseException {
+
+  /**
+   * Initialize a newly created exception to have no message and to be its own cause.
+   */
+  InsufficientContextException() : super();
+
+  /**
+   * Initialize a newly created exception to have the given message and to be its own cause.
+   *
+   * @param message the message describing the reason for the exception
+   */
+  InsufficientContextException.con1(String message) : super.con1(message);
+
+  /**
+   * Initialize a newly created exception to have no message and to have the given cause.
+   *
+   * @param cause the exception that caused this exception
+   */
+  InsufficientContextException.con2(Exception cause) : super.con2(cause);
+}
+/**
  * Instances of the class `Parser` are used to parse tokens into an AST structure.
  *
  * @coverage dart.engine.parser
@@ -176,8 +1206,8 @@
   static String _HIDE = "hide";
   static String _OF = "of";
   static String _ON = "on";
-  static String _SHOW = "show";
   static String _NATIVE = "native";
+  static String _SHOW = "show";
 
   /**
    * Initialize a newly created parser.
@@ -259,6 +1289,1008 @@
       instrumentation.log();
     }
   }
+
+  /**
+   * Parse an annotation.
+   *
+   * <pre>
+   * annotation ::=
+   *     '@' qualified ('.' identifier)? arguments?
+   * </pre>
+   *
+   * @return the annotation that was parsed
+   */
+  Annotation parseAnnotation() {
+    Token atSign = expect2(TokenType.AT);
+    Identifier name = parsePrefixedIdentifier();
+    Token period = null;
+    SimpleIdentifier constructorName = null;
+    if (matches5(TokenType.PERIOD)) {
+      period = andAdvance;
+      constructorName = parseSimpleIdentifier();
+    }
+    ArgumentList arguments = null;
+    if (matches5(TokenType.OPEN_PAREN)) {
+      arguments = parseArgumentList();
+    }
+    return new Annotation.full(atSign, name, period, constructorName, arguments);
+  }
+
+  /**
+   * Parse an argument.
+   *
+   * <pre>
+   * argument ::=
+   *     namedArgument
+   *   | expression
+   *
+   * namedArgument ::=
+   *     label expression
+   * </pre>
+   *
+   * @return the argument that was parsed
+   */
+  Expression parseArgument() {
+    if (matchesIdentifier() && matches4(peek(), TokenType.COLON)) {
+      return new NamedExpression.full(parseLabel(), parseExpression2());
+    } else {
+      return parseExpression2();
+    }
+  }
+
+  /**
+   * Parse a list of arguments.
+   *
+   * <pre>
+   * arguments ::=
+   *     '(' argumentList? ')'
+   *
+   * argumentList ::=
+   *     namedArgument (',' namedArgument)*
+   *   | expressionList (',' namedArgument)*
+   * </pre>
+   *
+   * @return the argument list that was parsed
+   */
+  ArgumentList parseArgumentList() {
+    Token leftParenthesis = expect2(TokenType.OPEN_PAREN);
+    List<Expression> arguments = new List<Expression>();
+    if (matches5(TokenType.CLOSE_PAREN)) {
+      return new ArgumentList.full(leftParenthesis, arguments, andAdvance);
+    }
+    Expression argument = parseArgument();
+    arguments.add(argument);
+    bool foundNamedArgument = argument is NamedExpression;
+    bool generatedError = false;
+    while (optional(TokenType.COMMA)) {
+      argument = parseArgument();
+      arguments.add(argument);
+      if (foundNamedArgument) {
+        if (!generatedError && argument is! NamedExpression) {
+          reportError8(ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT, []);
+          generatedError = true;
+        }
+      } else if (argument is NamedExpression) {
+        foundNamedArgument = true;
+      }
+    }
+    Token rightParenthesis = expect2(TokenType.CLOSE_PAREN);
+    return new ArgumentList.full(leftParenthesis, arguments, rightParenthesis);
+  }
+
+  /**
+   * Parse a bitwise or expression.
+   *
+   * <pre>
+   * bitwiseOrExpression ::=
+   *     bitwiseXorExpression ('|' bitwiseXorExpression)*
+   *   | 'super' ('|' bitwiseXorExpression)+
+   * </pre>
+   *
+   * @return the bitwise or expression that was parsed
+   */
+  Expression parseBitwiseOrExpression() {
+    Expression expression;
+    if (matches(Keyword.SUPER) && matches4(peek(), TokenType.BAR)) {
+      expression = new SuperExpression.full(andAdvance);
+    } else {
+      expression = parseBitwiseXorExpression();
+    }
+    while (matches5(TokenType.BAR)) {
+      Token operator = andAdvance;
+      expression = new BinaryExpression.full(expression, operator, parseBitwiseXorExpression());
+    }
+    return expression;
+  }
+
+  /**
+   * Parse a block.
+   *
+   * <pre>
+   * block ::=
+   *     '{' statements '}'
+   * </pre>
+   *
+   * @return the block that was parsed
+   */
+  Block parseBlock() {
+    Token leftBracket = expect2(TokenType.OPEN_CURLY_BRACKET);
+    List<Statement> statements = new List<Statement>();
+    Token statementStart = _currentToken;
+    while (!matches5(TokenType.EOF) && !matches5(TokenType.CLOSE_CURLY_BRACKET)) {
+      Statement statement = parseStatement2();
+      if (statement != null) {
+        statements.add(statement);
+      }
+      if (identical(_currentToken, statementStart)) {
+        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        advance();
+      }
+      statementStart = _currentToken;
+    }
+    Token rightBracket = expect2(TokenType.CLOSE_CURLY_BRACKET);
+    return new Block.full(leftBracket, statements, rightBracket);
+  }
+
+  /**
+   * Parse a class member.
+   *
+   * <pre>
+   * classMemberDefinition ::=
+   *     declaration ';'
+   *   | methodSignature functionBody
+   * </pre>
+   *
+   * @param className the name of the class containing the member being parsed
+   * @return the class member that was parsed, or `null` if what was found was not a valid
+   *         class member
+   */
+  ClassMember parseClassMember(String className) {
+    CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
+    Modifiers modifiers = parseModifiers();
+    if (matches(Keyword.VOID)) {
+      TypeName returnType = parseReturnType();
+      if (matches(Keyword.GET) && matchesIdentifier2(peek())) {
+        validateModifiersForGetterOrSetterOrMethod(modifiers);
+        return parseGetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, returnType);
+      } else if (matches(Keyword.SET) && matchesIdentifier2(peek())) {
+        validateModifiersForGetterOrSetterOrMethod(modifiers);
+        return parseSetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, returnType);
+      } else if (matches(Keyword.OPERATOR) && isOperator(peek())) {
+        validateModifiersForOperator(modifiers);
+        return parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType);
+      } else if (matchesIdentifier() && matchesAny(peek(), [
+          TokenType.OPEN_PAREN,
+          TokenType.OPEN_CURLY_BRACKET,
+          TokenType.FUNCTION])) {
+        validateModifiersForGetterOrSetterOrMethod(modifiers);
+        return parseMethodDeclaration(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, returnType);
+      } else {
+        if (matchesIdentifier()) {
+          if (matchesAny(peek(), [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
+            reportError(ParserErrorCode.VOID_VARIABLE, returnType, []);
+            return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), returnType);
+          }
+        }
+        if (isOperator(_currentToken)) {
+          validateModifiersForOperator(modifiers);
+          return parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType);
+        }
+        reportError9(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
+        return null;
+      }
+    } else if (matches(Keyword.GET) && matchesIdentifier2(peek())) {
+      validateModifiersForGetterOrSetterOrMethod(modifiers);
+      return parseGetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, null);
+    } else if (matches(Keyword.SET) && matchesIdentifier2(peek())) {
+      validateModifiersForGetterOrSetterOrMethod(modifiers);
+      return parseSetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, null);
+    } else if (matches(Keyword.OPERATOR) && isOperator(peek())) {
+      validateModifiersForOperator(modifiers);
+      return parseOperator(commentAndMetadata, modifiers.externalKeyword, null);
+    } else if (!matchesIdentifier()) {
+      if (isOperator(_currentToken)) {
+        validateModifiersForOperator(modifiers);
+        return parseOperator(commentAndMetadata, modifiers.externalKeyword, null);
+      }
+      reportError9(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
+      return null;
+    } else if (matches4(peek(), TokenType.PERIOD) && matchesIdentifier2(peek2(2)) && matches4(peek2(3), TokenType.OPEN_PAREN)) {
+      return parseConstructor(commentAndMetadata, modifiers.externalKeyword, validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, parseSimpleIdentifier(), andAdvance, parseSimpleIdentifier(), parseFormalParameterList());
+    } else if (matches4(peek(), TokenType.OPEN_PAREN)) {
+      SimpleIdentifier methodName = parseSimpleIdentifier();
+      FormalParameterList parameters = parseFormalParameterList();
+      if (matches5(TokenType.COLON) || modifiers.factoryKeyword != null || methodName.name == className) {
+        return parseConstructor(commentAndMetadata, modifiers.externalKeyword, validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, methodName, null, null, parameters);
+      }
+      validateModifiersForGetterOrSetterOrMethod(modifiers);
+      validateFormalParameterList(parameters);
+      return parseMethodDeclaration2(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, null, methodName, parameters);
+    } else if (matchesAny(peek(), [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
+      if (modifiers.constKeyword == null && modifiers.finalKeyword == null && modifiers.varKeyword == null) {
+        reportError8(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
+      }
+      return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), null);
+    }
+    TypeName type = parseTypeName();
+    if (matches(Keyword.GET) && matchesIdentifier2(peek())) {
+      validateModifiersForGetterOrSetterOrMethod(modifiers);
+      return parseGetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type);
+    } else if (matches(Keyword.SET) && matchesIdentifier2(peek())) {
+      validateModifiersForGetterOrSetterOrMethod(modifiers);
+      return parseSetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type);
+    } else if (matches(Keyword.OPERATOR) && isOperator(peek())) {
+      validateModifiersForOperator(modifiers);
+      return parseOperator(commentAndMetadata, modifiers.externalKeyword, type);
+    } else if (!matchesIdentifier()) {
+      if (matches5(TokenType.CLOSE_CURLY_BRACKET)) {
+        return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), type);
+      }
+      if (isOperator(_currentToken)) {
+        validateModifiersForOperator(modifiers);
+        return parseOperator(commentAndMetadata, modifiers.externalKeyword, type);
+      }
+      reportError9(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
+      return null;
+    } else if (matches4(peek(), TokenType.OPEN_PAREN)) {
+      SimpleIdentifier methodName = parseSimpleIdentifier();
+      FormalParameterList parameters = parseFormalParameterList();
+      if (methodName.name == className) {
+        reportError(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, type, []);
+        return parseConstructor(commentAndMetadata, modifiers.externalKeyword, validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, methodName, null, null, parameters);
+      }
+      validateModifiersForGetterOrSetterOrMethod(modifiers);
+      validateFormalParameterList(parameters);
+      return parseMethodDeclaration2(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type, methodName, parameters);
+    }
+    return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), type);
+  }
+
+  /**
+   * Parse a compilation unit.
+   *
+   * Specified:
+   *
+   * <pre>
+   * compilationUnit ::=
+   *     scriptTag? directive* topLevelDeclaration*
+   * </pre>
+   * Actual:
+   *
+   * <pre>
+   * compilationUnit ::=
+   *     scriptTag? topLevelElement*
+   *
+   * topLevelElement ::=
+   *     directive
+   *   | topLevelDeclaration
+   * </pre>
+   *
+   * @return the compilation unit that was parsed
+   */
+  CompilationUnit parseCompilationUnit2() {
+    Token firstToken = _currentToken;
+    ScriptTag scriptTag = null;
+    if (matches5(TokenType.SCRIPT_TAG)) {
+      scriptTag = new ScriptTag.full(andAdvance);
+    }
+    bool libraryDirectiveFound = false;
+    bool partOfDirectiveFound = false;
+    bool partDirectiveFound = false;
+    bool directiveFoundAfterDeclaration = false;
+    List<Directive> directives = new List<Directive>();
+    List<CompilationUnitMember> declarations = new List<CompilationUnitMember>();
+    Token memberStart = _currentToken;
+    while (!matches5(TokenType.EOF)) {
+      CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
+      if ((matches(Keyword.IMPORT) || matches(Keyword.EXPORT) || matches(Keyword.LIBRARY) || matches(Keyword.PART)) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT)) {
+        Directive directive = parseDirective(commentAndMetadata);
+        if (declarations.length > 0 && !directiveFoundAfterDeclaration) {
+          reportError8(ParserErrorCode.DIRECTIVE_AFTER_DECLARATION, []);
+          directiveFoundAfterDeclaration = true;
+        }
+        if (directive is LibraryDirective) {
+          if (libraryDirectiveFound) {
+            reportError8(ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES, []);
+          } else {
+            if (directives.length > 0) {
+              reportError8(ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST, []);
+            }
+            libraryDirectiveFound = true;
+          }
+        } else if (directive is PartDirective) {
+          partDirectiveFound = true;
+        } else if (partDirectiveFound) {
+          if (directive is ExportDirective) {
+            reportError9(ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, ((directive as NamespaceDirective)).keyword, []);
+          } else if (directive is ImportDirective) {
+            reportError9(ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, ((directive as NamespaceDirective)).keyword, []);
+          }
+        }
+        if (directive is PartOfDirective) {
+          if (partOfDirectiveFound) {
+            reportError8(ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES, []);
+          } else {
+            for (Directive precedingDirective in directives) {
+              reportError9(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, precedingDirective.keyword, []);
+            }
+            partOfDirectiveFound = true;
+          }
+        } else {
+          if (partOfDirectiveFound) {
+            reportError9(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, directive.keyword, []);
+          }
+        }
+        directives.add(directive);
+      } else if (matches5(TokenType.SEMICOLON)) {
+        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        advance();
+      } else {
+        CompilationUnitMember member = parseCompilationUnitMember(commentAndMetadata);
+        if (member != null) {
+          declarations.add(member);
+        }
+      }
+      if (identical(_currentToken, memberStart)) {
+        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        advance();
+        while (!matches5(TokenType.EOF) && !couldBeStartOfCompilationUnitMember()) {
+          advance();
+        }
+      }
+      memberStart = _currentToken;
+    }
+    return new CompilationUnit.full(firstToken, scriptTag, directives, declarations, _currentToken);
+  }
+
+  /**
+   * Parse a conditional expression.
+   *
+   * <pre>
+   * conditionalExpression ::=
+   *     logicalOrExpression ('?' expressionWithoutCascade ':' expressionWithoutCascade)?
+   * </pre>
+   *
+   * @return the conditional expression that was parsed
+   */
+  Expression parseConditionalExpression() {
+    Expression condition = parseLogicalOrExpression();
+    if (!matches5(TokenType.QUESTION)) {
+      return condition;
+    }
+    Token question = andAdvance;
+    Expression thenExpression = parseExpressionWithoutCascade();
+    Token colon = expect2(TokenType.COLON);
+    Expression elseExpression = parseExpressionWithoutCascade();
+    return new ConditionalExpression.full(condition, question, thenExpression, colon, elseExpression);
+  }
+
+  /**
+   * Parse the name of a constructor.
+   *
+   * <pre>
+   * constructorName:
+   *     type ('.' identifier)?
+   * </pre>
+   *
+   * @return the constructor name that was parsed
+   */
+  ConstructorName parseConstructorName() {
+    TypeName type = parseTypeName();
+    Token period = null;
+    SimpleIdentifier name = null;
+    if (matches5(TokenType.PERIOD)) {
+      period = andAdvance;
+      name = parseSimpleIdentifier();
+    }
+    return new ConstructorName.full(type, period, name);
+  }
+
+  /**
+   * Parse an expression that does not contain any cascades.
+   *
+   * <pre>
+   * expression ::=
+   *     assignableExpression assignmentOperator expression
+   *   | conditionalExpression cascadeSection*
+   *   | throwExpression
+   * </pre>
+   *
+   * @return the expression that was parsed
+   */
+  Expression parseExpression2() {
+    if (matches(Keyword.THROW)) {
+      return parseThrowExpression();
+    } else if (matches(Keyword.RETHROW)) {
+      return parseRethrowExpression();
+    }
+    Expression expression = parseConditionalExpression();
+    TokenType tokenType = _currentToken.type;
+    if (identical(tokenType, TokenType.PERIOD_PERIOD)) {
+      List<Expression> cascadeSections = new List<Expression>();
+      while (identical(tokenType, TokenType.PERIOD_PERIOD)) {
+        Expression section = parseCascadeSection();
+        if (section != null) {
+          cascadeSections.add(section);
+        }
+        tokenType = _currentToken.type;
+      }
+      return new CascadeExpression.full(expression, cascadeSections);
+    } else if (tokenType.isAssignmentOperator) {
+      Token operator = andAdvance;
+      ensureAssignable(expression);
+      return new AssignmentExpression.full(expression, operator, parseExpression2());
+    }
+    return expression;
+  }
+
+  /**
+   * Parse an expression that does not contain any cascades.
+   *
+   * <pre>
+   * expressionWithoutCascade ::=
+   *     assignableExpression assignmentOperator expressionWithoutCascade
+   *   | conditionalExpression
+   *   | throwExpressionWithoutCascade
+   * </pre>
+   *
+   * @return the expression that was parsed
+   */
+  Expression parseExpressionWithoutCascade() {
+    if (matches(Keyword.THROW)) {
+      return parseThrowExpressionWithoutCascade();
+    } else if (matches(Keyword.RETHROW)) {
+      return parseRethrowExpression();
+    }
+    Expression expression = parseConditionalExpression();
+    if (_currentToken.type.isAssignmentOperator) {
+      Token operator = andAdvance;
+      ensureAssignable(expression);
+      expression = new AssignmentExpression.full(expression, operator, parseExpressionWithoutCascade());
+    }
+    return expression;
+  }
+
+  /**
+   * Parse a class extends clause.
+   *
+   * <pre>
+   * classExtendsClause ::=
+   *     'extends' type
+   * </pre>
+   *
+   * @return the class extends clause that was parsed
+   */
+  ExtendsClause parseExtendsClause() {
+    Token keyword = expect(Keyword.EXTENDS);
+    TypeName superclass = parseTypeName();
+    return new ExtendsClause.full(keyword, superclass);
+  }
+
+  /**
+   * Parse a list of formal parameters.
+   *
+   * <pre>
+   * formalParameterList ::=
+   *     '(' ')'
+   *   | '(' normalFormalParameters (',' optionalFormalParameters)? ')'
+   *   | '(' optionalFormalParameters ')'
+   *
+   * normalFormalParameters ::=
+   *     normalFormalParameter (',' normalFormalParameter)*
+   *
+   * optionalFormalParameters ::=
+   *     optionalPositionalFormalParameters
+   *   | namedFormalParameters
+   *
+   * optionalPositionalFormalParameters ::=
+   *     '[' defaultFormalParameter (',' defaultFormalParameter)* ']'
+   *
+   * namedFormalParameters ::=
+   *     '{' defaultNamedParameter (',' defaultNamedParameter)* '}'
+   * </pre>
+   *
+   * @return the formal parameters that were parsed
+   */
+  FormalParameterList parseFormalParameterList() {
+    Token leftParenthesis = expect2(TokenType.OPEN_PAREN);
+    if (matches5(TokenType.CLOSE_PAREN)) {
+      return new FormalParameterList.full(leftParenthesis, null, null, null, andAdvance);
+    }
+    List<FormalParameter> parameters = new List<FormalParameter>();
+    List<FormalParameter> normalParameters = new List<FormalParameter>();
+    List<FormalParameter> positionalParameters = new List<FormalParameter>();
+    List<FormalParameter> namedParameters = new List<FormalParameter>();
+    List<FormalParameter> currentParameters = normalParameters;
+    Token leftSquareBracket = null;
+    Token rightSquareBracket = null;
+    Token leftCurlyBracket = null;
+    Token rightCurlyBracket = null;
+    ParameterKind kind = ParameterKind.REQUIRED;
+    bool firstParameter = true;
+    bool reportedMuliplePositionalGroups = false;
+    bool reportedMulipleNamedGroups = false;
+    bool reportedMixedGroups = false;
+    bool wasOptionalParameter = false;
+    Token initialToken = null;
+    do {
+      if (firstParameter) {
+        firstParameter = false;
+      } else if (!optional(TokenType.COMMA)) {
+        if (getEndToken(leftParenthesis) != null) {
+          reportError8(ParserErrorCode.EXPECTED_TOKEN, [TokenType.COMMA.lexeme]);
+        } else {
+          reportError9(ParserErrorCode.MISSING_CLOSING_PARENTHESIS, _currentToken.previous, []);
+          break;
+        }
+      }
+      initialToken = _currentToken;
+      if (matches5(TokenType.OPEN_SQUARE_BRACKET)) {
+        wasOptionalParameter = true;
+        if (leftSquareBracket != null && !reportedMuliplePositionalGroups) {
+          reportError8(ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS, []);
+          reportedMuliplePositionalGroups = true;
+        }
+        if (leftCurlyBracket != null && !reportedMixedGroups) {
+          reportError8(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
+          reportedMixedGroups = true;
+        }
+        leftSquareBracket = andAdvance;
+        currentParameters = positionalParameters;
+        kind = ParameterKind.POSITIONAL;
+      } else if (matches5(TokenType.OPEN_CURLY_BRACKET)) {
+        wasOptionalParameter = true;
+        if (leftCurlyBracket != null && !reportedMulipleNamedGroups) {
+          reportError8(ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS, []);
+          reportedMulipleNamedGroups = true;
+        }
+        if (leftSquareBracket != null && !reportedMixedGroups) {
+          reportError8(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
+          reportedMixedGroups = true;
+        }
+        leftCurlyBracket = andAdvance;
+        currentParameters = namedParameters;
+        kind = ParameterKind.NAMED;
+      }
+      FormalParameter parameter = parseFormalParameter(kind);
+      parameters.add(parameter);
+      currentParameters.add(parameter);
+      if (identical(kind, ParameterKind.REQUIRED) && wasOptionalParameter) {
+        reportError(ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS, parameter, []);
+      }
+      if (matches5(TokenType.CLOSE_SQUARE_BRACKET)) {
+        rightSquareBracket = andAdvance;
+        currentParameters = normalParameters;
+        if (leftSquareBracket == null) {
+          if (leftCurlyBracket != null) {
+            reportError8(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
+            rightCurlyBracket = rightSquareBracket;
+            rightSquareBracket = null;
+          } else {
+            reportError8(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["["]);
+          }
+        }
+        kind = ParameterKind.REQUIRED;
+      } else if (matches5(TokenType.CLOSE_CURLY_BRACKET)) {
+        rightCurlyBracket = andAdvance;
+        currentParameters = normalParameters;
+        if (leftCurlyBracket == null) {
+          if (leftSquareBracket != null) {
+            reportError8(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
+            rightSquareBracket = rightCurlyBracket;
+            rightCurlyBracket = null;
+          } else {
+            reportError8(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["{"]);
+          }
+        }
+        kind = ParameterKind.REQUIRED;
+      }
+    } while (!matches5(TokenType.CLOSE_PAREN) && initialToken != _currentToken);
+    Token rightParenthesis = expect2(TokenType.CLOSE_PAREN);
+    if (leftSquareBracket != null && rightSquareBracket == null) {
+      reportError8(ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
+    }
+    if (leftCurlyBracket != null && rightCurlyBracket == null) {
+      reportError8(ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
+    }
+    if (leftSquareBracket == null) {
+      leftSquareBracket = leftCurlyBracket;
+    }
+    if (rightSquareBracket == null) {
+      rightSquareBracket = rightCurlyBracket;
+    }
+    return new FormalParameterList.full(leftParenthesis, parameters, leftSquareBracket, rightSquareBracket, rightParenthesis);
+  }
+
+  /**
+   * Parse a function expression.
+   *
+   * <pre>
+   * functionExpression ::=
+   *     formalParameterList functionExpressionBody
+   * </pre>
+   *
+   * @return the function expression that was parsed
+   */
+  FunctionExpression parseFunctionExpression() {
+    FormalParameterList parameters = parseFormalParameterList();
+    validateFormalParameterList(parameters);
+    FunctionBody body = parseFunctionBody(false, ParserErrorCode.MISSING_FUNCTION_BODY, true);
+    return new FunctionExpression.full(parameters, body);
+  }
+
+  /**
+   * Parse an implements clause.
+   *
+   * <pre>
+   * implementsClause ::=
+   *     'implements' type (',' type)*
+   * </pre>
+   *
+   * @return the implements clause that was parsed
+   */
+  ImplementsClause parseImplementsClause() {
+    Token keyword = expect(Keyword.IMPLEMENTS);
+    List<TypeName> interfaces = new List<TypeName>();
+    interfaces.add(parseTypeName());
+    while (optional(TokenType.COMMA)) {
+      interfaces.add(parseTypeName());
+    }
+    return new ImplementsClause.full(keyword, interfaces);
+  }
+
+  /**
+   * Parse a label.
+   *
+   * <pre>
+   * label ::=
+   *     identifier ':'
+   * </pre>
+   *
+   * @return the label that was parsed
+   */
+  Label parseLabel() {
+    SimpleIdentifier label = parseSimpleIdentifier();
+    Token colon = expect2(TokenType.COLON);
+    return new Label.full(label, colon);
+  }
+
+  /**
+   * Parse a library identifier.
+   *
+   * <pre>
+   * libraryIdentifier ::=
+   *     identifier ('.' identifier)*
+   * </pre>
+   *
+   * @return the library identifier that was parsed
+   */
+  LibraryIdentifier parseLibraryIdentifier() {
+    List<SimpleIdentifier> components = new List<SimpleIdentifier>();
+    components.add(parseSimpleIdentifier());
+    while (matches5(TokenType.PERIOD)) {
+      advance();
+      components.add(parseSimpleIdentifier());
+    }
+    return new LibraryIdentifier.full(components);
+  }
+
+  /**
+   * Parse a logical or expression.
+   *
+   * <pre>
+   * logicalOrExpression ::=
+   *     logicalAndExpression ('||' logicalAndExpression)*
+   * </pre>
+   *
+   * @return the logical or expression that was parsed
+   */
+  Expression parseLogicalOrExpression() {
+    Expression expression = parseLogicalAndExpression();
+    while (matches5(TokenType.BAR_BAR)) {
+      Token operator = andAdvance;
+      expression = new BinaryExpression.full(expression, operator, parseLogicalAndExpression());
+    }
+    return expression;
+  }
+
+  /**
+   * Parse a map literal entry.
+   *
+   * <pre>
+   * mapLiteralEntry ::=
+   *     expression ':' expression
+   * </pre>
+   *
+   * @return the map literal entry that was parsed
+   */
+  MapLiteralEntry parseMapLiteralEntry() {
+    Expression key = parseExpression2();
+    Token separator = expect2(TokenType.COLON);
+    Expression value = parseExpression2();
+    return new MapLiteralEntry.full(key, separator, value);
+  }
+
+  /**
+   * Parse a normal formal parameter.
+   *
+   * <pre>
+   * normalFormalParameter ::=
+   *     functionSignature
+   *   | fieldFormalParameter
+   *   | simpleFormalParameter
+   *
+   * functionSignature:
+   *     metadata returnType? identifier formalParameterList
+   *
+   * fieldFormalParameter ::=
+   *     metadata finalConstVarOrType? 'this' '.' identifier
+   *
+   * simpleFormalParameter ::=
+   *     declaredIdentifier
+   *   | metadata identifier
+   * </pre>
+   *
+   * @return the normal formal parameter that was parsed
+   */
+  NormalFormalParameter parseNormalFormalParameter() {
+    CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
+    FinalConstVarOrType holder = parseFinalConstVarOrType(true);
+    Token thisKeyword = null;
+    Token period = null;
+    if (matches(Keyword.THIS)) {
+      thisKeyword = andAdvance;
+      period = expect2(TokenType.PERIOD);
+    }
+    SimpleIdentifier identifier = parseSimpleIdentifier();
+    if (matches5(TokenType.OPEN_PAREN)) {
+      FormalParameterList parameters = parseFormalParameterList();
+      if (thisKeyword == null) {
+        if (holder.keyword != null) {
+          reportError9(ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, holder.keyword, []);
+        }
+        return new FunctionTypedFormalParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, holder.type, identifier, parameters);
+      } else {
+        return new FieldFormalParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, holder.keyword, holder.type, thisKeyword, period, identifier, parameters);
+      }
+    }
+    TypeName type = holder.type;
+    if (type != null) {
+      if (matches3(type.name.beginToken, Keyword.VOID)) {
+        reportError9(ParserErrorCode.VOID_PARAMETER, type.name.beginToken, []);
+      } else if (holder.keyword != null && matches3(holder.keyword, Keyword.VAR)) {
+        reportError9(ParserErrorCode.VAR_AND_TYPE, holder.keyword, []);
+      }
+    }
+    if (thisKeyword != null) {
+      return new FieldFormalParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, holder.keyword, holder.type, thisKeyword, period, identifier, null);
+    }
+    return new SimpleFormalParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, holder.keyword, holder.type, identifier);
+  }
+
+  /**
+   * Parse a prefixed identifier.
+   *
+   * <pre>
+   * prefixedIdentifier ::=
+   *     identifier ('.' identifier)?
+   * </pre>
+   *
+   * @return the prefixed identifier that was parsed
+   */
+  Identifier parsePrefixedIdentifier() {
+    SimpleIdentifier qualifier = parseSimpleIdentifier();
+    if (!matches5(TokenType.PERIOD)) {
+      return qualifier;
+    }
+    Token period = andAdvance;
+    SimpleIdentifier qualified = parseSimpleIdentifier();
+    return new PrefixedIdentifier.full(qualifier, period, qualified);
+  }
+
+  /**
+   * Parse a return type.
+   *
+   * <pre>
+   * returnType ::=
+   *     'void'
+   *   | type
+   * </pre>
+   *
+   * @return the return type that was parsed
+   */
+  TypeName parseReturnType() {
+    if (matches(Keyword.VOID)) {
+      return new TypeName.full(new SimpleIdentifier.full(andAdvance), null);
+    } else {
+      return parseTypeName();
+    }
+  }
+
+  /**
+   * Parse a simple identifier.
+   *
+   * <pre>
+   * identifier ::=
+   *     IDENTIFIER
+   * </pre>
+   *
+   * @return the simple identifier that was parsed
+   */
+  SimpleIdentifier parseSimpleIdentifier() {
+    if (matchesIdentifier()) {
+      return new SimpleIdentifier.full(andAdvance);
+    }
+    reportError8(ParserErrorCode.MISSING_IDENTIFIER, []);
+    return createSyntheticIdentifier();
+  }
+
+  /**
+   * Parse a statement.
+   *
+   * <pre>
+   * statement ::=
+   *     label* nonLabeledStatement
+   * </pre>
+   *
+   * @return the statement that was parsed
+   */
+  Statement parseStatement2() {
+    List<Label> labels = new List<Label>();
+    while (matchesIdentifier() && matches4(peek(), TokenType.COLON)) {
+      labels.add(parseLabel());
+    }
+    Statement statement = parseNonLabeledStatement();
+    if (labels.isEmpty) {
+      return statement;
+    }
+    return new LabeledStatement.full(labels, statement);
+  }
+
+  /**
+   * Parse a string literal.
+   *
+   * <pre>
+   * stringLiteral ::=
+   *     MULTI_LINE_STRING+
+   *   | SINGLE_LINE_STRING+
+   * </pre>
+   *
+   * @return the string literal that was parsed
+   */
+  StringLiteral parseStringLiteral() {
+    List<StringLiteral> strings = new List<StringLiteral>();
+    while (matches5(TokenType.STRING)) {
+      Token string = andAdvance;
+      if (matches5(TokenType.STRING_INTERPOLATION_EXPRESSION) || matches5(TokenType.STRING_INTERPOLATION_IDENTIFIER)) {
+        strings.add(parseStringInterpolation(string));
+      } else {
+        strings.add(new SimpleStringLiteral.full(string, computeStringValue(string.lexeme, true, true)));
+      }
+    }
+    if (strings.length < 1) {
+      reportError8(ParserErrorCode.EXPECTED_STRING_LITERAL, []);
+      return createSyntheticStringLiteral();
+    } else if (strings.length == 1) {
+      return strings[0];
+    } else {
+      return new AdjacentStrings.full(strings);
+    }
+  }
+
+  /**
+   * Parse a list of type arguments.
+   *
+   * <pre>
+   * typeArguments ::=
+   *     '<' typeList '>'
+   *
+   * typeList ::=
+   *     type (',' type)*
+   * </pre>
+   *
+   * @return the type argument list that was parsed
+   */
+  TypeArgumentList parseTypeArgumentList() {
+    Token leftBracket = expect2(TokenType.LT);
+    List<TypeName> arguments = new List<TypeName>();
+    arguments.add(parseTypeName());
+    while (optional(TokenType.COMMA)) {
+      arguments.add(parseTypeName());
+    }
+    Token rightBracket = expect2(TokenType.GT);
+    return new TypeArgumentList.full(leftBracket, arguments, rightBracket);
+  }
+
+  /**
+   * Parse a type name.
+   *
+   * <pre>
+   * type ::=
+   *     qualified typeArguments?
+   * </pre>
+   *
+   * @return the type name that was parsed
+   */
+  TypeName parseTypeName() {
+    Identifier typeName;
+    if (matches(Keyword.VAR)) {
+      reportError8(ParserErrorCode.VAR_AS_TYPE_NAME, []);
+      typeName = new SimpleIdentifier.full(andAdvance);
+    } else if (matchesIdentifier()) {
+      typeName = parsePrefixedIdentifier();
+    } else {
+      typeName = createSyntheticIdentifier();
+      reportError8(ParserErrorCode.EXPECTED_TYPE_NAME, []);
+    }
+    TypeArgumentList typeArguments = null;
+    if (matches5(TokenType.LT)) {
+      typeArguments = parseTypeArgumentList();
+    }
+    return new TypeName.full(typeName, typeArguments);
+  }
+
+  /**
+   * Parse a type parameter.
+   *
+   * <pre>
+   * typeParameter ::=
+   *     metadata name ('extends' bound)?
+   * </pre>
+   *
+   * @return the type parameter that was parsed
+   */
+  TypeParameter parseTypeParameter() {
+    CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
+    SimpleIdentifier name = parseSimpleIdentifier();
+    if (matches(Keyword.EXTENDS)) {
+      Token keyword = andAdvance;
+      TypeName bound = parseTypeName();
+      return new TypeParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, name, keyword, bound);
+    }
+    return new TypeParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, name, null, null);
+  }
+
+  /**
+   * Parse a list of type parameters.
+   *
+   * <pre>
+   * typeParameterList ::=
+   *     '<' typeParameter (',' typeParameter)* '>'
+   * </pre>
+   *
+   * @return the list of type parameters that were parsed
+   */
+  TypeParameterList parseTypeParameterList() {
+    Token leftBracket = expect2(TokenType.LT);
+    List<TypeParameter> typeParameters = new List<TypeParameter>();
+    typeParameters.add(parseTypeParameter());
+    while (optional(TokenType.COMMA)) {
+      typeParameters.add(parseTypeParameter());
+    }
+    Token rightBracket = expect2(TokenType.GT);
+    return new TypeParameterList.full(leftBracket, typeParameters, rightBracket);
+  }
+
+  /**
+   * Parse a with clause.
+   *
+   * <pre>
+   * withClause ::=
+   *     'with' typeName (',' typeName)*
+   * </pre>
+   *
+   * @return the with clause that was parsed
+   */
+  WithClause parseWithClause() {
+    Token with2 = expect(Keyword.WITH);
+    List<TypeName> types = new List<TypeName>();
+    types.add(parseTypeName());
+    while (optional(TokenType.COMMA)) {
+      types.add(parseTypeName());
+    }
+    return new WithClause.full(with2, types);
+  }
   void set currentToken(Token currentToken) {
     this._currentToken = currentToken;
   }
@@ -952,56 +2984,6 @@
   }
 
   /**
-   * Parse an annotation.
-   *
-   * <pre>
-   * annotation ::=
-   *     '@' qualified ('.' identifier)? arguments?
-   * </pre>
-   *
-   * @return the annotation that was parsed
-   */
-  Annotation parseAnnotation() {
-    Token atSign = expect2(TokenType.AT);
-    Identifier name = parsePrefixedIdentifier();
-    Token period = null;
-    SimpleIdentifier constructorName = null;
-    if (matches5(TokenType.PERIOD)) {
-      period = andAdvance;
-      constructorName = parseSimpleIdentifier();
-    }
-    ArgumentList arguments = null;
-    if (matches5(TokenType.OPEN_PAREN)) {
-      arguments = parseArgumentList();
-    }
-    return new Annotation.full(atSign, name, period, constructorName, arguments);
-  }
-
-  /**
-   * Parse an argument.
-   *
-   * <pre>
-   * argument ::=
-   *     namedArgument
-   *   | expression
-   *
-   * namedArgument ::=
-   *     label expression
-   * </pre>
-   *
-   * @return the argument that was parsed
-   */
-  Expression parseArgument() {
-    if (matchesIdentifier() && matches4(peek(), TokenType.COLON)) {
-      SimpleIdentifier label = new SimpleIdentifier.full(andAdvance);
-      Label name = new Label.full(label, andAdvance);
-      return new NamedExpression.full(name, parseExpression2());
-    } else {
-      return parseExpression2();
-    }
-  }
-
-  /**
    * Parse an argument definition test.
    *
    * <pre>
@@ -1019,46 +3001,6 @@
   }
 
   /**
-   * Parse a list of arguments.
-   *
-   * <pre>
-   * arguments ::=
-   *     '(' argumentList? ')'
-   *
-   * argumentList ::=
-   *     namedArgument (',' namedArgument)*
-   *   | expressionList (',' namedArgument)*
-   * </pre>
-   *
-   * @return the argument list that was parsed
-   */
-  ArgumentList parseArgumentList() {
-    Token leftParenthesis = expect2(TokenType.OPEN_PAREN);
-    List<Expression> arguments = new List<Expression>();
-    if (matches5(TokenType.CLOSE_PAREN)) {
-      return new ArgumentList.full(leftParenthesis, arguments, andAdvance);
-    }
-    Expression argument = parseArgument();
-    arguments.add(argument);
-    bool foundNamedArgument = argument is NamedExpression;
-    bool generatedError = false;
-    while (optional(TokenType.COMMA)) {
-      argument = parseArgument();
-      arguments.add(argument);
-      if (foundNamedArgument) {
-        if (!generatedError && argument is! NamedExpression) {
-          reportError8(ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT, []);
-          generatedError = true;
-        }
-      } else if (argument is NamedExpression) {
-        foundNamedArgument = true;
-      }
-    }
-    Token rightParenthesis = expect2(TokenType.CLOSE_PAREN);
-    return new ArgumentList.full(leftParenthesis, arguments, rightParenthesis);
-  }
-
-  /**
    * Parse an assert statement.
    *
    * <pre>
@@ -1193,31 +3135,6 @@
   }
 
   /**
-   * Parse a bitwise or expression.
-   *
-   * <pre>
-   * bitwiseOrExpression ::=
-   *     bitwiseXorExpression ('|' bitwiseXorExpression)*
-   *   | 'super' ('|' bitwiseXorExpression)+
-   * </pre>
-   *
-   * @return the bitwise or expression that was parsed
-   */
-  Expression parseBitwiseOrExpression() {
-    Expression expression;
-    if (matches(Keyword.SUPER) && matches4(peek(), TokenType.BAR)) {
-      expression = new SuperExpression.full(andAdvance);
-    } else {
-      expression = parseBitwiseXorExpression();
-    }
-    while (matches5(TokenType.BAR)) {
-      Token operator = andAdvance;
-      expression = new BinaryExpression.full(expression, operator, parseBitwiseXorExpression());
-    }
-    return expression;
-  }
-
-  /**
    * Parse a bitwise exclusive-or expression.
    *
    * <pre>
@@ -1243,35 +3160,6 @@
   }
 
   /**
-   * Parse a block.
-   *
-   * <pre>
-   * block ::=
-   *     '{' statements '}'
-   * </pre>
-   *
-   * @return the block that was parsed
-   */
-  Block parseBlock() {
-    Token leftBracket = expect2(TokenType.OPEN_CURLY_BRACKET);
-    List<Statement> statements = new List<Statement>();
-    Token statementStart = _currentToken;
-    while (!matches5(TokenType.EOF) && !matches5(TokenType.CLOSE_CURLY_BRACKET)) {
-      Statement statement = parseStatement2();
-      if (statement != null) {
-        statements.add(statement);
-      }
-      if (identical(_currentToken, statementStart)) {
-        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
-        advance();
-      }
-      statementStart = _currentToken;
-    }
-    Token rightBracket = expect2(TokenType.CLOSE_CURLY_BRACKET);
-    return new Block.full(leftBracket, statements, rightBracket);
-  }
-
-  /**
    * Parse a break statement.
    *
    * <pre>
@@ -1351,7 +3239,12 @@
         expression = selector;
         progress = true;
         while (identical(_currentToken.type, TokenType.OPEN_PAREN)) {
-          expression = new FunctionExpressionInvocation.full(expression, parseArgumentList());
+          if (expression is PropertyAccess) {
+            PropertyAccess propertyAccess = expression as PropertyAccess;
+            expression = new MethodInvocation.full(propertyAccess.target, propertyAccess.operator, propertyAccess.propertyName, parseArgumentList());
+          } else {
+            expression = new FunctionExpressionInvocation.full(expression, parseArgumentList());
+          }
         }
       }
     }
@@ -1459,120 +3352,6 @@
   }
 
   /**
-   * Parse a class member.
-   *
-   * <pre>
-   * classMemberDefinition ::=
-   *     declaration ';'
-   *   | methodSignature functionBody
-   * </pre>
-   *
-   * @param className the name of the class containing the member being parsed
-   * @return the class member that was parsed, or `null` if what was found was not a valid
-   *         class member
-   */
-  ClassMember parseClassMember(String className) {
-    CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
-    Modifiers modifiers = parseModifiers();
-    if (matches(Keyword.VOID)) {
-      TypeName returnType = parseReturnType();
-      if (matches(Keyword.GET) && matchesIdentifier2(peek())) {
-        validateModifiersForGetterOrSetterOrMethod(modifiers);
-        return parseGetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, returnType);
-      } else if (matches(Keyword.SET) && matchesIdentifier2(peek())) {
-        validateModifiersForGetterOrSetterOrMethod(modifiers);
-        return parseSetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, returnType);
-      } else if (matches(Keyword.OPERATOR) && isOperator(peek())) {
-        validateModifiersForOperator(modifiers);
-        return parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType);
-      } else if (matchesIdentifier() && matchesAny(peek(), [
-          TokenType.OPEN_PAREN,
-          TokenType.OPEN_CURLY_BRACKET,
-          TokenType.FUNCTION])) {
-        validateModifiersForGetterOrSetterOrMethod(modifiers);
-        return parseMethodDeclaration(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, returnType);
-      } else {
-        if (matchesIdentifier()) {
-          if (matchesAny(peek(), [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
-            reportError(ParserErrorCode.VOID_VARIABLE, returnType, []);
-            return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), returnType);
-          }
-        }
-        if (isOperator(_currentToken)) {
-          validateModifiersForOperator(modifiers);
-          return parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType);
-        }
-        reportError9(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
-        return null;
-      }
-    } else if (matches(Keyword.GET) && matchesIdentifier2(peek())) {
-      validateModifiersForGetterOrSetterOrMethod(modifiers);
-      return parseGetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, null);
-    } else if (matches(Keyword.SET) && matchesIdentifier2(peek())) {
-      validateModifiersForGetterOrSetterOrMethod(modifiers);
-      return parseSetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, null);
-    } else if (matches(Keyword.OPERATOR) && isOperator(peek())) {
-      validateModifiersForOperator(modifiers);
-      return parseOperator(commentAndMetadata, modifiers.externalKeyword, null);
-    } else if (!matchesIdentifier()) {
-      if (isOperator(_currentToken)) {
-        validateModifiersForOperator(modifiers);
-        return parseOperator(commentAndMetadata, modifiers.externalKeyword, null);
-      }
-      reportError9(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
-      return null;
-    } else if (matches4(peek(), TokenType.PERIOD) && matchesIdentifier2(peek2(2)) && matches4(peek2(3), TokenType.OPEN_PAREN)) {
-      return parseConstructor(commentAndMetadata, modifiers.externalKeyword, validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, parseSimpleIdentifier(), andAdvance, parseSimpleIdentifier(), parseFormalParameterList());
-    } else if (matches4(peek(), TokenType.OPEN_PAREN)) {
-      SimpleIdentifier methodName = parseSimpleIdentifier();
-      FormalParameterList parameters = parseFormalParameterList();
-      if (matches5(TokenType.COLON) || modifiers.factoryKeyword != null || methodName.name == className) {
-        return parseConstructor(commentAndMetadata, modifiers.externalKeyword, validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, methodName, null, null, parameters);
-      }
-      validateModifiersForGetterOrSetterOrMethod(modifiers);
-      validateFormalParameterList(parameters);
-      return parseMethodDeclaration2(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, null, methodName, parameters);
-    } else if (matchesAny(peek(), [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
-      if (modifiers.constKeyword == null && modifiers.finalKeyword == null && modifiers.varKeyword == null) {
-        reportError8(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
-      }
-      return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), null);
-    }
-    TypeName type = parseTypeName();
-    if (matches(Keyword.GET) && matchesIdentifier2(peek())) {
-      validateModifiersForGetterOrSetterOrMethod(modifiers);
-      return parseGetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type);
-    } else if (matches(Keyword.SET) && matchesIdentifier2(peek())) {
-      validateModifiersForGetterOrSetterOrMethod(modifiers);
-      return parseSetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type);
-    } else if (matches(Keyword.OPERATOR) && isOperator(peek())) {
-      validateModifiersForOperator(modifiers);
-      return parseOperator(commentAndMetadata, modifiers.externalKeyword, type);
-    } else if (!matchesIdentifier()) {
-      if (matches5(TokenType.CLOSE_CURLY_BRACKET)) {
-        return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), type);
-      }
-      if (isOperator(_currentToken)) {
-        validateModifiersForOperator(modifiers);
-        return parseOperator(commentAndMetadata, modifiers.externalKeyword, type);
-      }
-      reportError9(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
-      return null;
-    } else if (matches4(peek(), TokenType.OPEN_PAREN)) {
-      SimpleIdentifier methodName = parseSimpleIdentifier();
-      FormalParameterList parameters = parseFormalParameterList();
-      if (methodName.name == className) {
-        reportError(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, type, []);
-        return parseConstructor(commentAndMetadata, modifiers.externalKeyword, validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, methodName, null, null, parameters);
-      }
-      validateModifiersForGetterOrSetterOrMethod(modifiers);
-      validateFormalParameterList(parameters);
-      return parseMethodDeclaration2(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type, methodName, parameters);
-    }
-    return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), type);
-  }
-
-  /**
    * Parse a list of class members.
    *
    * <pre>
@@ -1814,103 +3593,6 @@
   }
 
   /**
-   * Parse a compilation unit.
-   *
-   * Specified:
-   *
-   * <pre>
-   * compilationUnit ::=
-   *     scriptTag? directive* topLevelDeclaration*
-   * </pre>
-   * Actual:
-   *
-   * <pre>
-   * compilationUnit ::=
-   *     scriptTag? topLevelElement*
-   *
-   * topLevelElement ::=
-   *     directive
-   *   | topLevelDeclaration
-   * </pre>
-   *
-   * @return the compilation unit that was parsed
-   */
-  CompilationUnit parseCompilationUnit2() {
-    Token firstToken = _currentToken;
-    ScriptTag scriptTag = null;
-    if (matches5(TokenType.SCRIPT_TAG)) {
-      scriptTag = new ScriptTag.full(andAdvance);
-    }
-    bool libraryDirectiveFound = false;
-    bool partOfDirectiveFound = false;
-    bool partDirectiveFound = false;
-    bool directiveFoundAfterDeclaration = false;
-    List<Directive> directives = new List<Directive>();
-    List<CompilationUnitMember> declarations = new List<CompilationUnitMember>();
-    Token memberStart = _currentToken;
-    while (!matches5(TokenType.EOF)) {
-      CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
-      if ((matches(Keyword.IMPORT) || matches(Keyword.EXPORT) || matches(Keyword.LIBRARY) || matches(Keyword.PART)) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT)) {
-        Directive directive = parseDirective(commentAndMetadata);
-        if (declarations.length > 0 && !directiveFoundAfterDeclaration) {
-          reportError8(ParserErrorCode.DIRECTIVE_AFTER_DECLARATION, []);
-          directiveFoundAfterDeclaration = true;
-        }
-        if (directive is LibraryDirective) {
-          if (libraryDirectiveFound) {
-            reportError8(ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES, []);
-          } else {
-            if (directives.length > 0) {
-              reportError8(ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST, []);
-            }
-            libraryDirectiveFound = true;
-          }
-        } else if (directive is PartDirective) {
-          partDirectiveFound = true;
-        } else if (partDirectiveFound) {
-          if (directive is ExportDirective) {
-            reportError9(ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, ((directive as NamespaceDirective)).keyword, []);
-          } else if (directive is ImportDirective) {
-            reportError9(ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, ((directive as NamespaceDirective)).keyword, []);
-          }
-        }
-        if (directive is PartOfDirective) {
-          if (partOfDirectiveFound) {
-            reportError8(ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES, []);
-          } else {
-            for (Directive precedingDirective in directives) {
-              reportError9(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, precedingDirective.keyword, []);
-            }
-            partOfDirectiveFound = true;
-          }
-        } else {
-          if (partOfDirectiveFound) {
-            reportError9(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, directive.keyword, []);
-          }
-        }
-        directives.add(directive);
-      } else if (matches5(TokenType.SEMICOLON)) {
-        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
-        advance();
-      } else {
-        CompilationUnitMember member = parseCompilationUnitMember(commentAndMetadata);
-        if (member != null) {
-          declarations.add(member);
-        }
-      }
-      if (identical(_currentToken, memberStart)) {
-        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
-        advance();
-        while (!matches5(TokenType.EOF) && !couldBeStartOfCompilationUnitMember()) {
-          advance();
-        }
-      }
-      memberStart = _currentToken;
-    }
-    return new CompilationUnit.full(firstToken, scriptTag, directives, declarations, _currentToken);
-  }
-
-  /**
    * Parse a compilation unit member.
    *
    * <pre>
@@ -2012,28 +3694,6 @@
   }
 
   /**
-   * Parse a conditional expression.
-   *
-   * <pre>
-   * conditionalExpression ::=
-   *     logicalOrExpression ('?' expressionWithoutCascade ':' expressionWithoutCascade)?
-   * </pre>
-   *
-   * @return the conditional expression that was parsed
-   */
-  Expression parseConditionalExpression() {
-    Expression condition = parseLogicalOrExpression();
-    if (!matches5(TokenType.QUESTION)) {
-      return condition;
-    }
-    Token question = andAdvance;
-    Expression thenExpression = parseExpressionWithoutCascade();
-    Token colon = expect2(TokenType.COLON);
-    Expression elseExpression = parseExpressionWithoutCascade();
-    return new ConditionalExpression.full(condition, question, thenExpression, colon, elseExpression);
-  }
-
-  /**
    * Parse a const expression.
    *
    * <pre>
@@ -2145,27 +3805,6 @@
   }
 
   /**
-   * Parse the name of a constructor.
-   *
-   * <pre>
-   * constructorName:
-   *     type ('.' identifier)?
-   * </pre>
-   *
-   * @return the constructor name that was parsed
-   */
-  ConstructorName parseConstructorName() {
-    TypeName type = parseTypeName();
-    Token period = null;
-    SimpleIdentifier name = null;
-    if (matches5(TokenType.PERIOD)) {
-      period = andAdvance;
-      name = parseSimpleIdentifier();
-    }
-    return new ConstructorName.full(type, period, name);
-  }
-
-  /**
    * Parse a continue statement.
    *
    * <pre>
@@ -2346,44 +3985,6 @@
   }
 
   /**
-   * Parse an expression that does not contain any cascades.
-   *
-   * <pre>
-   * expression ::=
-   *     assignableExpression assignmentOperator expression
-   *   | conditionalExpression cascadeSection*
-   *   | throwExpression
-   * </pre>
-   *
-   * @return the expression that was parsed
-   */
-  Expression parseExpression2() {
-    if (matches(Keyword.THROW)) {
-      return parseThrowExpression();
-    } else if (matches(Keyword.RETHROW)) {
-      return parseRethrowExpression();
-    }
-    Expression expression = parseConditionalExpression();
-    TokenType tokenType = _currentToken.type;
-    if (identical(tokenType, TokenType.PERIOD_PERIOD)) {
-      List<Expression> cascadeSections = new List<Expression>();
-      while (identical(tokenType, TokenType.PERIOD_PERIOD)) {
-        Expression section = parseCascadeSection();
-        if (section != null) {
-          cascadeSections.add(section);
-        }
-        tokenType = _currentToken.type;
-      }
-      return new CascadeExpression.full(expression, cascadeSections);
-    } else if (tokenType.isAssignmentOperator) {
-      Token operator = andAdvance;
-      ensureAssignable(expression);
-      return new AssignmentExpression.full(expression, operator, parseExpression2());
-    }
-    return expression;
-  }
-
-  /**
    * Parse a list of expressions.
    *
    * <pre>
@@ -2403,49 +4004,6 @@
   }
 
   /**
-   * Parse an expression that does not contain any cascades.
-   *
-   * <pre>
-   * expressionWithoutCascade ::=
-   *     assignableExpression assignmentOperator expressionWithoutCascade
-   *   | conditionalExpression
-   *   | throwExpressionWithoutCascade
-   * </pre>
-   *
-   * @return the expression that was parsed
-   */
-  Expression parseExpressionWithoutCascade() {
-    if (matches(Keyword.THROW)) {
-      return parseThrowExpressionWithoutCascade();
-    } else if (matches(Keyword.RETHROW)) {
-      return parseRethrowExpression();
-    }
-    Expression expression = parseConditionalExpression();
-    if (_currentToken.type.isAssignmentOperator) {
-      Token operator = andAdvance;
-      ensureAssignable(expression);
-      expression = new AssignmentExpression.full(expression, operator, parseExpressionWithoutCascade());
-    }
-    return expression;
-  }
-
-  /**
-   * Parse a class extends clause.
-   *
-   * <pre>
-   * classExtendsClause ::=
-   *     'extends' type
-   * </pre>
-   *
-   * @return the class extends clause that was parsed
-   */
-  ExtendsClause parseExtendsClause() {
-    Token keyword = expect(Keyword.EXTENDS);
-    TypeName superclass = parseTypeName();
-    return new ExtendsClause.full(keyword, superclass);
-  }
-
-  /**
    * Parse the 'final', 'const', 'var' or type preceding a variable declaration.
    *
    * <pre>
@@ -2522,141 +4080,6 @@
   }
 
   /**
-   * Parse a list of formal parameters.
-   *
-   * <pre>
-   * formalParameterList ::=
-   *     '(' ')'
-   *   | '(' normalFormalParameters (',' optionalFormalParameters)? ')'
-   *   | '(' optionalFormalParameters ')'
-   *
-   * normalFormalParameters ::=
-   *     normalFormalParameter (',' normalFormalParameter)*
-   *
-   * optionalFormalParameters ::=
-   *     optionalPositionalFormalParameters
-   *   | namedFormalParameters
-   *
-   * optionalPositionalFormalParameters ::=
-   *     '[' defaultFormalParameter (',' defaultFormalParameter)* ']'
-   *
-   * namedFormalParameters ::=
-   *     '{' defaultNamedParameter (',' defaultNamedParameter)* '}'
-   * </pre>
-   *
-   * @return the formal parameters that were parsed
-   */
-  FormalParameterList parseFormalParameterList() {
-    Token leftParenthesis = expect2(TokenType.OPEN_PAREN);
-    if (matches5(TokenType.CLOSE_PAREN)) {
-      return new FormalParameterList.full(leftParenthesis, null, null, null, andAdvance);
-    }
-    List<FormalParameter> parameters = new List<FormalParameter>();
-    List<FormalParameter> normalParameters = new List<FormalParameter>();
-    List<FormalParameter> positionalParameters = new List<FormalParameter>();
-    List<FormalParameter> namedParameters = new List<FormalParameter>();
-    List<FormalParameter> currentParameters = normalParameters;
-    Token leftSquareBracket = null;
-    Token rightSquareBracket = null;
-    Token leftCurlyBracket = null;
-    Token rightCurlyBracket = null;
-    ParameterKind kind = ParameterKind.REQUIRED;
-    bool firstParameter = true;
-    bool reportedMuliplePositionalGroups = false;
-    bool reportedMulipleNamedGroups = false;
-    bool reportedMixedGroups = false;
-    bool wasOptionalParameter = false;
-    Token initialToken = null;
-    do {
-      if (firstParameter) {
-        firstParameter = false;
-      } else if (!optional(TokenType.COMMA)) {
-        if (getEndToken(leftParenthesis) != null) {
-          reportError8(ParserErrorCode.EXPECTED_TOKEN, [TokenType.COMMA.lexeme]);
-        } else {
-          reportError9(ParserErrorCode.MISSING_CLOSING_PARENTHESIS, _currentToken.previous, []);
-          break;
-        }
-      }
-      initialToken = _currentToken;
-      if (matches5(TokenType.OPEN_SQUARE_BRACKET)) {
-        wasOptionalParameter = true;
-        if (leftSquareBracket != null && !reportedMuliplePositionalGroups) {
-          reportError8(ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS, []);
-          reportedMuliplePositionalGroups = true;
-        }
-        if (leftCurlyBracket != null && !reportedMixedGroups) {
-          reportError8(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
-          reportedMixedGroups = true;
-        }
-        leftSquareBracket = andAdvance;
-        currentParameters = positionalParameters;
-        kind = ParameterKind.POSITIONAL;
-      } else if (matches5(TokenType.OPEN_CURLY_BRACKET)) {
-        wasOptionalParameter = true;
-        if (leftCurlyBracket != null && !reportedMulipleNamedGroups) {
-          reportError8(ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS, []);
-          reportedMulipleNamedGroups = true;
-        }
-        if (leftSquareBracket != null && !reportedMixedGroups) {
-          reportError8(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
-          reportedMixedGroups = true;
-        }
-        leftCurlyBracket = andAdvance;
-        currentParameters = namedParameters;
-        kind = ParameterKind.NAMED;
-      }
-      FormalParameter parameter = parseFormalParameter(kind);
-      parameters.add(parameter);
-      currentParameters.add(parameter);
-      if (identical(kind, ParameterKind.REQUIRED) && wasOptionalParameter) {
-        reportError(ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS, parameter, []);
-      }
-      if (matches5(TokenType.CLOSE_SQUARE_BRACKET)) {
-        rightSquareBracket = andAdvance;
-        currentParameters = normalParameters;
-        if (leftSquareBracket == null) {
-          if (leftCurlyBracket != null) {
-            reportError8(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
-            rightCurlyBracket = rightSquareBracket;
-            rightSquareBracket = null;
-          } else {
-            reportError8(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["["]);
-          }
-        }
-        kind = ParameterKind.REQUIRED;
-      } else if (matches5(TokenType.CLOSE_CURLY_BRACKET)) {
-        rightCurlyBracket = andAdvance;
-        currentParameters = normalParameters;
-        if (leftCurlyBracket == null) {
-          if (leftSquareBracket != null) {
-            reportError8(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
-            rightSquareBracket = rightCurlyBracket;
-            rightCurlyBracket = null;
-          } else {
-            reportError8(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["{"]);
-          }
-        }
-        kind = ParameterKind.REQUIRED;
-      }
-    } while (!matches5(TokenType.CLOSE_PAREN) && initialToken != _currentToken);
-    Token rightParenthesis = expect2(TokenType.CLOSE_PAREN);
-    if (leftSquareBracket != null && rightSquareBracket == null) {
-      reportError8(ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
-    }
-    if (leftCurlyBracket != null && rightCurlyBracket == null) {
-      reportError8(ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
-    }
-    if (leftSquareBracket == null) {
-      leftSquareBracket = leftCurlyBracket;
-    }
-    if (rightSquareBracket == null) {
-      rightSquareBracket = rightCurlyBracket;
-    }
-    return new FormalParameterList.full(leftParenthesis, parameters, leftSquareBracket, rightSquareBracket, rightParenthesis);
-  }
-
-  /**
    * Parse a for statement.
    *
    * <pre>
@@ -2894,23 +4317,6 @@
   }
 
   /**
-   * Parse a function expression.
-   *
-   * <pre>
-   * functionExpression ::=
-   *     formalParameterList functionExpressionBody
-   * </pre>
-   *
-   * @return the function expression that was parsed
-   */
-  FunctionExpression parseFunctionExpression() {
-    FormalParameterList parameters = parseFormalParameterList();
-    validateFormalParameterList(parameters);
-    FunctionBody body = parseFunctionBody(false, ParserErrorCode.MISSING_FUNCTION_BODY, true);
-    return new FunctionExpression.full(parameters, body);
-  }
-
-  /**
    * Parse a function type alias.
    *
    * <pre>
@@ -3030,26 +4436,6 @@
   }
 
   /**
-   * Parse an implements clause.
-   *
-   * <pre>
-   * implementsClause ::=
-   *     'implements' type (',' type)*
-   * </pre>
-   *
-   * @return the implements clause that was parsed
-   */
-  ImplementsClause parseImplementsClause() {
-    Token keyword = expect(Keyword.IMPLEMENTS);
-    List<TypeName> interfaces = new List<TypeName>();
-    interfaces.add(parseTypeName());
-    while (optional(TokenType.COMMA)) {
-      interfaces.add(parseTypeName());
-    }
-    return new ImplementsClause.full(keyword, interfaces);
-  }
-
-  /**
    * Parse an import directive.
    *
    * <pre>
@@ -3138,26 +4524,6 @@
   }
 
   /**
-   * Parse a library identifier.
-   *
-   * <pre>
-   * libraryIdentifier ::=
-   *     identifier ('.' identifier)*
-   * </pre>
-   *
-   * @return the library identifier that was parsed
-   */
-  LibraryIdentifier parseLibraryIdentifier() {
-    List<SimpleIdentifier> components = new List<SimpleIdentifier>();
-    components.add(parseSimpleIdentifier());
-    while (matches5(TokenType.PERIOD)) {
-      advance();
-      components.add(parseSimpleIdentifier());
-    }
-    return new LibraryIdentifier.full(components);
-  }
-
-  /**
    * Parse a library name.
    *
    * <pre>
@@ -3272,25 +4638,6 @@
   }
 
   /**
-   * Parse a logical or expression.
-   *
-   * <pre>
-   * logicalOrExpression ::=
-   *     logicalAndExpression ('||' logicalAndExpression)*
-   * </pre>
-   *
-   * @return the logical or expression that was parsed
-   */
-  Expression parseLogicalOrExpression() {
-    Expression expression = parseLogicalAndExpression();
-    while (matches5(TokenType.BAR_BAR)) {
-      Token operator = andAdvance;
-      expression = new BinaryExpression.full(expression, operator, parseLogicalAndExpression());
-    }
-    return expression;
-  }
-
-  /**
    * Parse a map literal.
    *
    * <pre>
@@ -3322,23 +4669,6 @@
   }
 
   /**
-   * Parse a map literal entry.
-   *
-   * <pre>
-   * mapLiteralEntry ::=
-   *     expression ':' expression
-   * </pre>
-   *
-   * @return the map literal entry that was parsed
-   */
-  MapLiteralEntry parseMapLiteralEntry() {
-    Expression key = parseExpression2();
-    Token separator = expect2(TokenType.COLON);
-    Expression value = parseExpression2();
-    return new MapLiteralEntry.full(key, separator, value);
-  }
-
-  /**
    * Parse a method declaration.
    *
    * <pre>
@@ -3636,63 +4966,6 @@
   }
 
   /**
-   * Parse a normal formal parameter.
-   *
-   * <pre>
-   * normalFormalParameter ::=
-   *     functionSignature
-   *   | fieldFormalParameter
-   *   | simpleFormalParameter
-   *
-   * functionSignature:
-   *     metadata returnType? identifier formalParameterList
-   *
-   * fieldFormalParameter ::=
-   *     metadata finalConstVarOrType? 'this' '.' identifier
-   *
-   * simpleFormalParameter ::=
-   *     declaredIdentifier
-   *   | metadata identifier
-   * </pre>
-   *
-   * @return the normal formal parameter that was parsed
-   */
-  NormalFormalParameter parseNormalFormalParameter() {
-    CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
-    FinalConstVarOrType holder = parseFinalConstVarOrType(true);
-    Token thisKeyword = null;
-    Token period = null;
-    if (matches(Keyword.THIS)) {
-      thisKeyword = andAdvance;
-      period = expect2(TokenType.PERIOD);
-    }
-    SimpleIdentifier identifier = parseSimpleIdentifier();
-    if (matches5(TokenType.OPEN_PAREN)) {
-      FormalParameterList parameters = parseFormalParameterList();
-      if (thisKeyword == null) {
-        if (holder.keyword != null) {
-          reportError9(ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, holder.keyword, []);
-        }
-        return new FunctionTypedFormalParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, holder.type, identifier, parameters);
-      } else {
-        return new FieldFormalParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, holder.keyword, holder.type, thisKeyword, period, identifier, parameters);
-      }
-    }
-    TypeName type = holder.type;
-    if (type != null) {
-      if (matches3(type.name.beginToken, Keyword.VOID)) {
-        reportError9(ParserErrorCode.VOID_PARAMETER, type.name.beginToken, []);
-      } else if (holder.keyword != null && matches3(holder.keyword, Keyword.VAR)) {
-        reportError9(ParserErrorCode.VAR_AND_TYPE, holder.keyword, []);
-      }
-    }
-    if (thisKeyword != null) {
-      return new FieldFormalParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, holder.keyword, holder.type, thisKeyword, period, identifier, null);
-    }
-    return new SimpleFormalParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, holder.keyword, holder.type, identifier);
-  }
-
-  /**
    * Parse an operator declaration.
    *
    * <pre>
@@ -3825,26 +5098,6 @@
   }
 
   /**
-   * Parse a prefixed identifier.
-   *
-   * <pre>
-   * prefixedIdentifier ::=
-   *     identifier ('.' identifier)?
-   * </pre>
-   *
-   * @return the prefixed identifier that was parsed
-   */
-  Identifier parsePrefixedIdentifier() {
-    SimpleIdentifier qualifier = parseSimpleIdentifier();
-    if (!matches5(TokenType.PERIOD)) {
-      return qualifier;
-    }
-    Token period = andAdvance;
-    SimpleIdentifier qualified = parseSimpleIdentifier();
-    return new PrefixedIdentifier.full(qualifier, period, qualified);
-  }
-
-  /**
    * Parse a primary expression.
    *
    * <pre>
@@ -4033,25 +5286,6 @@
   }
 
   /**
-   * Parse a return type.
-   *
-   * <pre>
-   * returnType ::=
-   *     'void'
-   *   | type
-   * </pre>
-   *
-   * @return the return type that was parsed
-   */
-  TypeName parseReturnType() {
-    if (matches(Keyword.VOID)) {
-      return new TypeName.full(new SimpleIdentifier.full(andAdvance), null);
-    } else {
-      return parseTypeName();
-    }
-  }
-
-  /**
    * Parse a setter.
    *
    * <pre>
@@ -4108,48 +5342,6 @@
   }
 
   /**
-   * Parse a simple identifier.
-   *
-   * <pre>
-   * identifier ::=
-   *     IDENTIFIER
-   * </pre>
-   *
-   * @return the simple identifier that was parsed
-   */
-  SimpleIdentifier parseSimpleIdentifier() {
-    if (matchesIdentifier()) {
-      return new SimpleIdentifier.full(andAdvance);
-    }
-    reportError8(ParserErrorCode.MISSING_IDENTIFIER, []);
-    return createSyntheticIdentifier();
-  }
-
-  /**
-   * Parse a statement.
-   *
-   * <pre>
-   * statement ::=
-   *     label* nonLabeledStatement
-   * </pre>
-   *
-   * @return the statement that was parsed
-   */
-  Statement parseStatement2() {
-    List<Label> labels = new List<Label>();
-    while (matchesIdentifier() && matches4(peek(), TokenType.COLON)) {
-      SimpleIdentifier label = parseSimpleIdentifier();
-      Token colon = expect2(TokenType.COLON);
-      labels.add(new Label.full(label, colon));
-    }
-    Statement statement = parseNonLabeledStatement();
-    if (labels.isEmpty) {
-      return statement;
-    }
-    return new LabeledStatement.full(labels, statement);
-  }
-
-  /**
    * Parse a list of statements within a switch statement.
    *
    * <pre>
@@ -4208,37 +5400,6 @@
   }
 
   /**
-   * Parse a string literal.
-   *
-   * <pre>
-   * stringLiteral ::=
-   *     MULTI_LINE_STRING+
-   *   | SINGLE_LINE_STRING+
-   * </pre>
-   *
-   * @return the string literal that was parsed
-   */
-  StringLiteral parseStringLiteral() {
-    List<StringLiteral> strings = new List<StringLiteral>();
-    while (matches5(TokenType.STRING)) {
-      Token string = andAdvance;
-      if (matches5(TokenType.STRING_INTERPOLATION_EXPRESSION) || matches5(TokenType.STRING_INTERPOLATION_IDENTIFIER)) {
-        strings.add(parseStringInterpolation(string));
-      } else {
-        strings.add(new SimpleStringLiteral.full(string, computeStringValue(string.lexeme, true, true)));
-      }
-    }
-    if (strings.length < 1) {
-      reportError8(ParserErrorCode.EXPECTED_STRING_LITERAL, []);
-      return createSyntheticStringLiteral();
-    } else if (strings.length == 1) {
-      return strings[0];
-    } else {
-      return new AdjacentStrings.full(strings);
-    }
-  }
-
-  /**
    * Parse a super constructor invocation.
    *
    * <pre>
@@ -4515,100 +5676,6 @@
   }
 
   /**
-   * Parse a list of type arguments.
-   *
-   * <pre>
-   * typeArguments ::=
-   *     '<' typeList '>'
-   *
-   * typeList ::=
-   *     type (',' type)*
-   * </pre>
-   *
-   * @return the type argument list that was parsed
-   */
-  TypeArgumentList parseTypeArgumentList() {
-    Token leftBracket = expect2(TokenType.LT);
-    List<TypeName> arguments = new List<TypeName>();
-    arguments.add(parseTypeName());
-    while (optional(TokenType.COMMA)) {
-      arguments.add(parseTypeName());
-    }
-    Token rightBracket = expect2(TokenType.GT);
-    return new TypeArgumentList.full(leftBracket, arguments, rightBracket);
-  }
-
-  /**
-   * Parse a type name.
-   *
-   * <pre>
-   * type ::=
-   *     qualified typeArguments?
-   * </pre>
-   *
-   * @return the type name that was parsed
-   */
-  TypeName parseTypeName() {
-    Identifier typeName;
-    if (matches(Keyword.VAR)) {
-      reportError8(ParserErrorCode.VAR_AS_TYPE_NAME, []);
-      typeName = new SimpleIdentifier.full(andAdvance);
-    } else if (matchesIdentifier()) {
-      typeName = parsePrefixedIdentifier();
-    } else {
-      typeName = createSyntheticIdentifier();
-      reportError8(ParserErrorCode.EXPECTED_TYPE_NAME, []);
-    }
-    TypeArgumentList typeArguments = null;
-    if (matches5(TokenType.LT)) {
-      typeArguments = parseTypeArgumentList();
-    }
-    return new TypeName.full(typeName, typeArguments);
-  }
-
-  /**
-   * Parse a type parameter.
-   *
-   * <pre>
-   * typeParameter ::=
-   *     metadata name ('extends' bound)?
-   * </pre>
-   *
-   * @return the type parameter that was parsed
-   */
-  TypeParameter parseTypeParameter() {
-    CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
-    SimpleIdentifier name = parseSimpleIdentifier();
-    if (matches(Keyword.EXTENDS)) {
-      Token keyword = andAdvance;
-      TypeName bound = parseTypeName();
-      return new TypeParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, name, keyword, bound);
-    }
-    return new TypeParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, name, null, null);
-  }
-
-  /**
-   * Parse a list of type parameters.
-   *
-   * <pre>
-   * typeParameterList ::=
-   *     '<' typeParameter (',' typeParameter)* '>'
-   * </pre>
-   *
-   * @return the list of type parameters that were parsed
-   */
-  TypeParameterList parseTypeParameterList() {
-    Token leftBracket = expect2(TokenType.LT);
-    List<TypeParameter> typeParameters = new List<TypeParameter>();
-    typeParameters.add(parseTypeParameter());
-    while (optional(TokenType.COMMA)) {
-      typeParameters.add(parseTypeParameter());
-    }
-    Token rightBracket = expect2(TokenType.GT);
-    return new TypeParameterList.full(leftBracket, typeParameters, rightBracket);
-  }
-
-  /**
    * Parse a unary expression.
    *
    * <pre>
@@ -4790,26 +5857,6 @@
   }
 
   /**
-   * Parse a with clause.
-   *
-   * <pre>
-   * withClause ::=
-   *     'with' typeName (',' typeName)*
-   * </pre>
-   *
-   * @return the with clause that was parsed
-   */
-  WithClause parseWithClause() {
-    Token with2 = expect(Keyword.WITH);
-    List<TypeName> types = new List<TypeName>();
-    types.add(parseTypeName());
-    while (optional(TokenType.COMMA)) {
-      types.add(parseTypeName());
-    }
-    return new WithClause.full(with2, types);
-  }
-
-  /**
    * Return the token that is immediately after the current token. This is equivalent to
    * [peek].
    *
@@ -6003,6 +7050,769 @@
   ErrorType get type => ErrorType.SYNTACTIC_ERROR;
 }
 /**
+ * Instances of the class `ResolutionCopier` copies resolution information from one AST
+ * structure to another as long as the structures of the corresponding children of a pair of nodes
+ * are the same.
+ */
+class ResolutionCopier implements ASTVisitor<bool> {
+
+  /**
+   * Copy resolution data from one node to another.
+   *
+   * @param fromNode the node from which resolution information will be copied
+   * @param toNode the node to which resolution information will be copied
+   */
+  static void copyResolutionData(ASTNode fromNode, ASTNode toNode) {
+    ResolutionCopier copier = new ResolutionCopier();
+    copier.isEqual(fromNode, toNode);
+  }
+
+  /**
+   * The AST node with which the node being visited is to be compared. This is only valid at the
+   * beginning of each visit method (until [isEqual] is invoked).
+   */
+  ASTNode _toNode;
+  bool visitAdjacentStrings(AdjacentStrings node) {
+    AdjacentStrings toNode = this._toNode as AdjacentStrings;
+    return isEqual2(node.strings, toNode.strings);
+  }
+  bool visitAnnotation(Annotation node) {
+    Annotation toNode = this._toNode as Annotation;
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.atSign, toNode.atSign), isEqual(node.name, toNode.name)), isEqual3(node.period, toNode.period)), isEqual(node.constructorName, toNode.constructorName)), isEqual(node.arguments, toNode.arguments))) {
+      toNode.element = node.element;
+      return true;
+    }
+    return false;
+  }
+  bool visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
+    ArgumentDefinitionTest toNode = this._toNode as ArgumentDefinitionTest;
+    if (javaBooleanAnd(isEqual3(node.question, toNode.question), isEqual(node.identifier, toNode.identifier))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitArgumentList(ArgumentList node) {
+    ArgumentList toNode = this._toNode as ArgumentList;
+    return javaBooleanAnd(javaBooleanAnd(isEqual3(node.leftParenthesis, toNode.leftParenthesis), isEqual2(node.arguments, toNode.arguments)), isEqual3(node.rightParenthesis, toNode.rightParenthesis));
+  }
+  bool visitAsExpression(AsExpression node) {
+    AsExpression toNode = this._toNode as AsExpression;
+    if (javaBooleanAnd(javaBooleanAnd(isEqual(node.expression, toNode.expression), isEqual3(node.asOperator, toNode.asOperator)), isEqual(node.type, toNode.type))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitAssertStatement(AssertStatement node) {
+    AssertStatement toNode = this._toNode as AssertStatement;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual3(node.leftParenthesis, toNode.leftParenthesis)), isEqual(node.condition, toNode.condition)), isEqual3(node.rightParenthesis, toNode.rightParenthesis)), isEqual3(node.semicolon, toNode.semicolon));
+  }
+  bool visitAssignmentExpression(AssignmentExpression node) {
+    AssignmentExpression toNode = this._toNode as AssignmentExpression;
+    if (javaBooleanAnd(javaBooleanAnd(isEqual(node.leftHandSide, toNode.leftHandSide), isEqual3(node.operator, toNode.operator)), isEqual(node.rightHandSide, toNode.rightHandSide))) {
+      toNode.propagatedElement = node.propagatedElement;
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitBinaryExpression(BinaryExpression node) {
+    BinaryExpression toNode = this._toNode as BinaryExpression;
+    if (javaBooleanAnd(javaBooleanAnd(isEqual(node.leftOperand, toNode.leftOperand), isEqual3(node.operator, toNode.operator)), isEqual(node.rightOperand, toNode.rightOperand))) {
+      toNode.propagatedElement = node.propagatedElement;
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitBlock(Block node) {
+    Block toNode = this._toNode as Block;
+    return javaBooleanAnd(javaBooleanAnd(isEqual3(node.leftBracket, toNode.leftBracket), isEqual2(node.statements, toNode.statements)), isEqual3(node.rightBracket, toNode.rightBracket));
+  }
+  bool visitBlockFunctionBody(BlockFunctionBody node) {
+    BlockFunctionBody toNode = this._toNode as BlockFunctionBody;
+    return isEqual(node.block, toNode.block);
+  }
+  bool visitBooleanLiteral(BooleanLiteral node) {
+    BooleanLiteral toNode = this._toNode as BooleanLiteral;
+    if (javaBooleanAnd(isEqual3(node.literal, toNode.literal), identical(node.value, toNode.value))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitBreakStatement(BreakStatement node) {
+    BreakStatement toNode = this._toNode as BreakStatement;
+    return javaBooleanAnd(javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual(node.label, toNode.label)), isEqual3(node.semicolon, toNode.semicolon));
+  }
+  bool visitCascadeExpression(CascadeExpression node) {
+    CascadeExpression toNode = this._toNode as CascadeExpression;
+    if (javaBooleanAnd(isEqual(node.target, toNode.target), isEqual2(node.cascadeSections, toNode.cascadeSections))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitCatchClause(CatchClause node) {
+    CatchClause toNode = this._toNode as CatchClause;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.onKeyword, toNode.onKeyword), isEqual(node.exceptionType, toNode.exceptionType)), isEqual3(node.catchKeyword, toNode.catchKeyword)), isEqual3(node.leftParenthesis, toNode.leftParenthesis)), isEqual(node.exceptionParameter, toNode.exceptionParameter)), isEqual3(node.comma, toNode.comma)), isEqual(node.stackTraceParameter, toNode.stackTraceParameter)), isEqual3(node.rightParenthesis, toNode.rightParenthesis)), isEqual(node.body, toNode.body));
+  }
+  bool visitClassDeclaration(ClassDeclaration node) {
+    ClassDeclaration toNode = this._toNode as ClassDeclaration;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.abstractKeyword, toNode.abstractKeyword)), isEqual3(node.classKeyword, toNode.classKeyword)), isEqual(node.name, toNode.name)), isEqual(node.typeParameters, toNode.typeParameters)), isEqual(node.extendsClause, toNode.extendsClause)), isEqual(node.withClause, toNode.withClause)), isEqual(node.implementsClause, toNode.implementsClause)), isEqual3(node.leftBracket, toNode.leftBracket)), isEqual2(node.members, toNode.members)), isEqual3(node.rightBracket, toNode.rightBracket));
+  }
+  bool visitClassTypeAlias(ClassTypeAlias node) {
+    ClassTypeAlias toNode = this._toNode as ClassTypeAlias;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.keyword, toNode.keyword)), isEqual(node.name, toNode.name)), isEqual(node.typeParameters, toNode.typeParameters)), isEqual3(node.equals, toNode.equals)), isEqual3(node.abstractKeyword, toNode.abstractKeyword)), isEqual(node.superclass, toNode.superclass)), isEqual(node.withClause, toNode.withClause)), isEqual(node.implementsClause, toNode.implementsClause)), isEqual3(node.semicolon, toNode.semicolon));
+  }
+  bool visitComment(Comment node) {
+    Comment toNode = this._toNode as Comment;
+    return isEqual2(node.references, toNode.references);
+  }
+  bool visitCommentReference(CommentReference node) {
+    CommentReference toNode = this._toNode as CommentReference;
+    return javaBooleanAnd(isEqual3(node.newKeyword, toNode.newKeyword), isEqual(node.identifier, toNode.identifier));
+  }
+  bool visitCompilationUnit(CompilationUnit node) {
+    CompilationUnit toNode = this._toNode as CompilationUnit;
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.beginToken, toNode.beginToken), isEqual(node.scriptTag, toNode.scriptTag)), isEqual2(node.directives, toNode.directives)), isEqual2(node.declarations, toNode.declarations)), isEqual3(node.endToken, toNode.endToken))) {
+      toNode.element = node.element;
+      return true;
+    }
+    return false;
+  }
+  bool visitConditionalExpression(ConditionalExpression node) {
+    ConditionalExpression toNode = this._toNode as ConditionalExpression;
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.condition, toNode.condition), isEqual3(node.question, toNode.question)), isEqual(node.thenExpression, toNode.thenExpression)), isEqual3(node.colon, toNode.colon)), isEqual(node.elseExpression, toNode.elseExpression))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitConstructorDeclaration(ConstructorDeclaration node) {
+    ConstructorDeclaration toNode = this._toNode as ConstructorDeclaration;
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.externalKeyword, toNode.externalKeyword)), isEqual3(node.constKeyword, toNode.constKeyword)), isEqual3(node.factoryKeyword, toNode.factoryKeyword)), isEqual(node.returnType, toNode.returnType)), isEqual3(node.period, toNode.period)), isEqual(node.name, toNode.name)), isEqual(node.parameters, toNode.parameters)), isEqual3(node.separator, toNode.separator)), isEqual2(node.initializers, toNode.initializers)), isEqual(node.redirectedConstructor, toNode.redirectedConstructor)), isEqual(node.body, toNode.body))) {
+      toNode.element = node.element;
+      return true;
+    }
+    return false;
+  }
+  bool visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    ConstructorFieldInitializer toNode = this._toNode as ConstructorFieldInitializer;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual3(node.period, toNode.period)), isEqual(node.fieldName, toNode.fieldName)), isEqual3(node.equals, toNode.equals)), isEqual(node.expression, toNode.expression));
+  }
+  bool visitConstructorName(ConstructorName node) {
+    ConstructorName toNode = this._toNode as ConstructorName;
+    if (javaBooleanAnd(javaBooleanAnd(isEqual(node.type, toNode.type), isEqual3(node.period, toNode.period)), isEqual(node.name, toNode.name))) {
+      toNode.staticElement = node.staticElement;
+      return true;
+    }
+    return false;
+  }
+  bool visitContinueStatement(ContinueStatement node) {
+    ContinueStatement toNode = this._toNode as ContinueStatement;
+    return javaBooleanAnd(javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual(node.label, toNode.label)), isEqual3(node.semicolon, toNode.semicolon));
+  }
+  bool visitDeclaredIdentifier(DeclaredIdentifier node) {
+    DeclaredIdentifier toNode = this._toNode as DeclaredIdentifier;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.keyword, toNode.keyword)), isEqual(node.type, toNode.type)), isEqual(node.identifier, toNode.identifier));
+  }
+  bool visitDefaultFormalParameter(DefaultFormalParameter node) {
+    DefaultFormalParameter toNode = this._toNode as DefaultFormalParameter;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.parameter, toNode.parameter), identical(node.kind, toNode.kind)), isEqual3(node.separator, toNode.separator)), isEqual(node.defaultValue, toNode.defaultValue));
+  }
+  bool visitDoStatement(DoStatement node) {
+    DoStatement toNode = this._toNode as DoStatement;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.doKeyword, toNode.doKeyword), isEqual(node.body, toNode.body)), isEqual3(node.whileKeyword, toNode.whileKeyword)), isEqual3(node.leftParenthesis, toNode.leftParenthesis)), isEqual(node.condition, toNode.condition)), isEqual3(node.rightParenthesis, toNode.rightParenthesis)), isEqual3(node.semicolon, toNode.semicolon));
+  }
+  bool visitDoubleLiteral(DoubleLiteral node) {
+    DoubleLiteral toNode = this._toNode as DoubleLiteral;
+    if (javaBooleanAnd(isEqual3(node.literal, toNode.literal), node.value == toNode.value)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitEmptyFunctionBody(EmptyFunctionBody node) {
+    EmptyFunctionBody toNode = this._toNode as EmptyFunctionBody;
+    return isEqual3(node.semicolon, toNode.semicolon);
+  }
+  bool visitEmptyStatement(EmptyStatement node) {
+    EmptyStatement toNode = this._toNode as EmptyStatement;
+    return isEqual3(node.semicolon, toNode.semicolon);
+  }
+  bool visitExportDirective(ExportDirective node) {
+    ExportDirective toNode = this._toNode as ExportDirective;
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.keyword, toNode.keyword)), isEqual(node.uri, toNode.uri)), isEqual2(node.combinators, toNode.combinators)), isEqual3(node.semicolon, toNode.semicolon))) {
+      toNode.element = node.element;
+      return true;
+    }
+    return false;
+  }
+  bool visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    ExpressionFunctionBody toNode = this._toNode as ExpressionFunctionBody;
+    return javaBooleanAnd(javaBooleanAnd(isEqual3(node.functionDefinition, toNode.functionDefinition), isEqual(node.expression, toNode.expression)), isEqual3(node.semicolon, toNode.semicolon));
+  }
+  bool visitExpressionStatement(ExpressionStatement node) {
+    ExpressionStatement toNode = this._toNode as ExpressionStatement;
+    return javaBooleanAnd(isEqual(node.expression, toNode.expression), isEqual3(node.semicolon, toNode.semicolon));
+  }
+  bool visitExtendsClause(ExtendsClause node) {
+    ExtendsClause toNode = this._toNode as ExtendsClause;
+    return javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual(node.superclass, toNode.superclass));
+  }
+  bool visitFieldDeclaration(FieldDeclaration node) {
+    FieldDeclaration toNode = this._toNode as FieldDeclaration;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.staticKeyword, toNode.staticKeyword)), isEqual(node.fields, toNode.fields)), isEqual3(node.semicolon, toNode.semicolon));
+  }
+  bool visitFieldFormalParameter(FieldFormalParameter node) {
+    FieldFormalParameter toNode = this._toNode as FieldFormalParameter;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.keyword, toNode.keyword)), isEqual(node.type, toNode.type)), isEqual3(node.thisToken, toNode.thisToken)), isEqual3(node.period, toNode.period)), isEqual(node.identifier, toNode.identifier));
+  }
+  bool visitForEachStatement(ForEachStatement node) {
+    ForEachStatement toNode = this._toNode as ForEachStatement;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.forKeyword, toNode.forKeyword), isEqual3(node.leftParenthesis, toNode.leftParenthesis)), isEqual(node.loopVariable, toNode.loopVariable)), isEqual3(node.inKeyword, toNode.inKeyword)), isEqual(node.iterator, toNode.iterator)), isEqual3(node.rightParenthesis, toNode.rightParenthesis)), isEqual(node.body, toNode.body));
+  }
+  bool visitFormalParameterList(FormalParameterList node) {
+    FormalParameterList toNode = this._toNode as FormalParameterList;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.leftParenthesis, toNode.leftParenthesis), isEqual2(node.parameters, toNode.parameters)), isEqual3(node.leftDelimiter, toNode.leftDelimiter)), isEqual3(node.rightDelimiter, toNode.rightDelimiter)), isEqual3(node.rightParenthesis, toNode.rightParenthesis));
+  }
+  bool visitForStatement(ForStatement node) {
+    ForStatement toNode = this._toNode as ForStatement;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.forKeyword, toNode.forKeyword), isEqual3(node.leftParenthesis, toNode.leftParenthesis)), isEqual(node.variables, toNode.variables)), isEqual(node.initialization, toNode.initialization)), isEqual3(node.leftSeparator, toNode.leftSeparator)), isEqual(node.condition, toNode.condition)), isEqual3(node.rightSeparator, toNode.rightSeparator)), isEqual2(node.updaters, toNode.updaters)), isEqual3(node.rightParenthesis, toNode.rightParenthesis)), isEqual(node.body, toNode.body));
+  }
+  bool visitFunctionDeclaration(FunctionDeclaration node) {
+    FunctionDeclaration toNode = this._toNode as FunctionDeclaration;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.externalKeyword, toNode.externalKeyword)), isEqual(node.returnType, toNode.returnType)), isEqual3(node.propertyKeyword, toNode.propertyKeyword)), isEqual(node.name, toNode.name)), isEqual(node.functionExpression, toNode.functionExpression));
+  }
+  bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+    FunctionDeclarationStatement toNode = this._toNode as FunctionDeclarationStatement;
+    return isEqual(node.functionDeclaration, toNode.functionDeclaration);
+  }
+  bool visitFunctionExpression(FunctionExpression node) {
+    FunctionExpression toNode = this._toNode as FunctionExpression;
+    if (javaBooleanAnd(isEqual(node.parameters, toNode.parameters), isEqual(node.body, toNode.body))) {
+      toNode.element = node.element;
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    FunctionExpressionInvocation toNode = this._toNode as FunctionExpressionInvocation;
+    if (javaBooleanAnd(isEqual(node.function, toNode.function), isEqual(node.argumentList, toNode.argumentList))) {
+      toNode.propagatedElement = node.propagatedElement;
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitFunctionTypeAlias(FunctionTypeAlias node) {
+    FunctionTypeAlias toNode = this._toNode as FunctionTypeAlias;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.keyword, toNode.keyword)), isEqual(node.returnType, toNode.returnType)), isEqual(node.name, toNode.name)), isEqual(node.typeParameters, toNode.typeParameters)), isEqual(node.parameters, toNode.parameters)), isEqual3(node.semicolon, toNode.semicolon));
+  }
+  bool visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    FunctionTypedFormalParameter toNode = this._toNode as FunctionTypedFormalParameter;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual(node.returnType, toNode.returnType)), isEqual(node.identifier, toNode.identifier)), isEqual(node.parameters, toNode.parameters));
+  }
+  bool visitHideCombinator(HideCombinator node) {
+    HideCombinator toNode = this._toNode as HideCombinator;
+    return javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual2(node.hiddenNames, toNode.hiddenNames));
+  }
+  bool visitIfStatement(IfStatement node) {
+    IfStatement toNode = this._toNode as IfStatement;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.ifKeyword, toNode.ifKeyword), isEqual3(node.leftParenthesis, toNode.leftParenthesis)), isEqual(node.condition, toNode.condition)), isEqual3(node.rightParenthesis, toNode.rightParenthesis)), isEqual(node.thenStatement, toNode.thenStatement)), isEqual3(node.elseKeyword, toNode.elseKeyword)), isEqual(node.elseStatement, toNode.elseStatement));
+  }
+  bool visitImplementsClause(ImplementsClause node) {
+    ImplementsClause toNode = this._toNode as ImplementsClause;
+    return javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual2(node.interfaces, toNode.interfaces));
+  }
+  bool visitImportDirective(ImportDirective node) {
+    ImportDirective toNode = this._toNode as ImportDirective;
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.keyword, toNode.keyword)), isEqual(node.uri, toNode.uri)), isEqual3(node.asToken, toNode.asToken)), isEqual(node.prefix, toNode.prefix)), isEqual2(node.combinators, toNode.combinators)), isEqual3(node.semicolon, toNode.semicolon))) {
+      toNode.element = node.element;
+      return true;
+    }
+    return false;
+  }
+  bool visitIndexExpression(IndexExpression node) {
+    IndexExpression toNode = this._toNode as IndexExpression;
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.target, toNode.target), isEqual3(node.leftBracket, toNode.leftBracket)), isEqual(node.index, toNode.index)), isEqual3(node.rightBracket, toNode.rightBracket))) {
+      toNode.auxiliaryElements = node.auxiliaryElements;
+      toNode.propagatedElement = node.propagatedElement;
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitInstanceCreationExpression(InstanceCreationExpression node) {
+    InstanceCreationExpression toNode = this._toNode as InstanceCreationExpression;
+    if (javaBooleanAnd(javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual(node.constructorName, toNode.constructorName)), isEqual(node.argumentList, toNode.argumentList))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitIntegerLiteral(IntegerLiteral node) {
+    IntegerLiteral toNode = this._toNode as IntegerLiteral;
+    if (javaBooleanAnd(isEqual3(node.literal, toNode.literal), identical(node.value, toNode.value))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitInterpolationExpression(InterpolationExpression node) {
+    InterpolationExpression toNode = this._toNode as InterpolationExpression;
+    return javaBooleanAnd(javaBooleanAnd(isEqual3(node.leftBracket, toNode.leftBracket), isEqual(node.expression, toNode.expression)), isEqual3(node.rightBracket, toNode.rightBracket));
+  }
+  bool visitInterpolationString(InterpolationString node) {
+    InterpolationString toNode = this._toNode as InterpolationString;
+    return javaBooleanAnd(isEqual3(node.contents, toNode.contents), node.value == toNode.value);
+  }
+  bool visitIsExpression(IsExpression node) {
+    IsExpression toNode = this._toNode as IsExpression;
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.expression, toNode.expression), isEqual3(node.isOperator, toNode.isOperator)), isEqual3(node.notOperator, toNode.notOperator)), isEqual(node.type, toNode.type))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitLabel(Label node) {
+    Label toNode = this._toNode as Label;
+    return javaBooleanAnd(isEqual(node.label, toNode.label), isEqual3(node.colon, toNode.colon));
+  }
+  bool visitLabeledStatement(LabeledStatement node) {
+    LabeledStatement toNode = this._toNode as LabeledStatement;
+    return javaBooleanAnd(isEqual2(node.labels, toNode.labels), isEqual(node.statement, toNode.statement));
+  }
+  bool visitLibraryDirective(LibraryDirective node) {
+    LibraryDirective toNode = this._toNode as LibraryDirective;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.libraryToken, toNode.libraryToken)), isEqual(node.name, toNode.name)), isEqual3(node.semicolon, toNode.semicolon));
+  }
+  bool visitLibraryIdentifier(LibraryIdentifier node) {
+    LibraryIdentifier toNode = this._toNode as LibraryIdentifier;
+    if (isEqual2(node.components, toNode.components)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitListLiteral(ListLiteral node) {
+    ListLiteral toNode = this._toNode as ListLiteral;
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.constKeyword, toNode.constKeyword), isEqual(node.typeArguments, toNode.typeArguments)), isEqual3(node.leftBracket, toNode.leftBracket)), isEqual2(node.elements, toNode.elements)), isEqual3(node.rightBracket, toNode.rightBracket))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitMapLiteral(MapLiteral node) {
+    MapLiteral toNode = this._toNode as MapLiteral;
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.constKeyword, toNode.constKeyword), isEqual(node.typeArguments, toNode.typeArguments)), isEqual3(node.leftBracket, toNode.leftBracket)), isEqual2(node.entries, toNode.entries)), isEqual3(node.rightBracket, toNode.rightBracket))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitMapLiteralEntry(MapLiteralEntry node) {
+    MapLiteralEntry toNode = this._toNode as MapLiteralEntry;
+    return javaBooleanAnd(javaBooleanAnd(isEqual(node.key, toNode.key), isEqual3(node.separator, toNode.separator)), isEqual(node.value, toNode.value));
+  }
+  bool visitMethodDeclaration(MethodDeclaration node) {
+    MethodDeclaration toNode = this._toNode as MethodDeclaration;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.externalKeyword, toNode.externalKeyword)), isEqual3(node.modifierKeyword, toNode.modifierKeyword)), isEqual(node.returnType, toNode.returnType)), isEqual3(node.propertyKeyword, toNode.propertyKeyword)), isEqual3(node.propertyKeyword, toNode.propertyKeyword)), isEqual(node.name, toNode.name)), isEqual(node.parameters, toNode.parameters)), isEqual(node.body, toNode.body));
+  }
+  bool visitMethodInvocation(MethodInvocation node) {
+    MethodInvocation toNode = this._toNode as MethodInvocation;
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.target, toNode.target), isEqual3(node.period, toNode.period)), isEqual(node.methodName, toNode.methodName)), isEqual(node.argumentList, toNode.argumentList))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitNamedExpression(NamedExpression node) {
+    NamedExpression toNode = this._toNode as NamedExpression;
+    if (javaBooleanAnd(isEqual(node.name, toNode.name), isEqual(node.expression, toNode.expression))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitNativeClause(NativeClause node) {
+    NativeClause toNode = this._toNode as NativeClause;
+    return javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual(node.name, toNode.name));
+  }
+  bool visitNativeFunctionBody(NativeFunctionBody node) {
+    NativeFunctionBody toNode = this._toNode as NativeFunctionBody;
+    return javaBooleanAnd(javaBooleanAnd(isEqual3(node.nativeToken, toNode.nativeToken), isEqual(node.stringLiteral, toNode.stringLiteral)), isEqual3(node.semicolon, toNode.semicolon));
+  }
+  bool visitNullLiteral(NullLiteral node) {
+    NullLiteral toNode = this._toNode as NullLiteral;
+    if (isEqual3(node.literal, toNode.literal)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitParenthesizedExpression(ParenthesizedExpression node) {
+    ParenthesizedExpression toNode = this._toNode as ParenthesizedExpression;
+    if (javaBooleanAnd(javaBooleanAnd(isEqual3(node.leftParenthesis, toNode.leftParenthesis), isEqual(node.expression, toNode.expression)), isEqual3(node.rightParenthesis, toNode.rightParenthesis))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitPartDirective(PartDirective node) {
+    PartDirective toNode = this._toNode as PartDirective;
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.partToken, toNode.partToken)), isEqual(node.uri, toNode.uri)), isEqual3(node.semicolon, toNode.semicolon))) {
+      toNode.element = node.element;
+      return true;
+    }
+    return false;
+  }
+  bool visitPartOfDirective(PartOfDirective node) {
+    PartOfDirective toNode = this._toNode as PartOfDirective;
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.partToken, toNode.partToken)), isEqual3(node.ofToken, toNode.ofToken)), isEqual(node.libraryName, toNode.libraryName)), isEqual3(node.semicolon, toNode.semicolon))) {
+      toNode.element = node.element;
+      return true;
+    }
+    return false;
+  }
+  bool visitPostfixExpression(PostfixExpression node) {
+    PostfixExpression toNode = this._toNode as PostfixExpression;
+    if (javaBooleanAnd(isEqual(node.operand, toNode.operand), isEqual3(node.operator, toNode.operator))) {
+      toNode.propagatedElement = node.propagatedElement;
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitPrefixedIdentifier(PrefixedIdentifier node) {
+    PrefixedIdentifier toNode = this._toNode as PrefixedIdentifier;
+    if (javaBooleanAnd(javaBooleanAnd(isEqual(node.prefix, toNode.prefix), isEqual3(node.period, toNode.period)), isEqual(node.identifier, toNode.identifier))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitPrefixExpression(PrefixExpression node) {
+    PrefixExpression toNode = this._toNode as PrefixExpression;
+    if (javaBooleanAnd(isEqual3(node.operator, toNode.operator), isEqual(node.operand, toNode.operand))) {
+      toNode.propagatedElement = node.propagatedElement;
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitPropertyAccess(PropertyAccess node) {
+    PropertyAccess toNode = this._toNode as PropertyAccess;
+    if (javaBooleanAnd(javaBooleanAnd(isEqual(node.target, toNode.target), isEqual3(node.operator, toNode.operator)), isEqual(node.propertyName, toNode.propertyName))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
+    RedirectingConstructorInvocation toNode = this._toNode as RedirectingConstructorInvocation;
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual3(node.period, toNode.period)), isEqual(node.constructorName, toNode.constructorName)), isEqual(node.argumentList, toNode.argumentList))) {
+      toNode.staticElement = node.staticElement;
+      return true;
+    }
+    return false;
+  }
+  bool visitRethrowExpression(RethrowExpression node) {
+    RethrowExpression toNode = this._toNode as RethrowExpression;
+    if (isEqual3(node.keyword, toNode.keyword)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitReturnStatement(ReturnStatement node) {
+    ReturnStatement toNode = this._toNode as ReturnStatement;
+    return javaBooleanAnd(javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual(node.expression, toNode.expression)), isEqual3(node.semicolon, toNode.semicolon));
+  }
+  bool visitScriptTag(ScriptTag node) {
+    ScriptTag toNode = this._toNode as ScriptTag;
+    return isEqual3(node.scriptTag, toNode.scriptTag);
+  }
+  bool visitShowCombinator(ShowCombinator node) {
+    ShowCombinator toNode = this._toNode as ShowCombinator;
+    return javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual2(node.shownNames, toNode.shownNames));
+  }
+  bool visitSimpleFormalParameter(SimpleFormalParameter node) {
+    SimpleFormalParameter toNode = this._toNode as SimpleFormalParameter;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.keyword, toNode.keyword)), isEqual(node.type, toNode.type)), isEqual(node.identifier, toNode.identifier));
+  }
+  bool visitSimpleIdentifier(SimpleIdentifier node) {
+    SimpleIdentifier toNode = this._toNode as SimpleIdentifier;
+    if (isEqual3(node.token, toNode.token)) {
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      toNode.propagatedElement = node.propagatedElement;
+      toNode.propagatedType = node.propagatedType;
+      toNode.auxiliaryElements = node.auxiliaryElements;
+      return true;
+    }
+    return false;
+  }
+  bool visitSimpleStringLiteral(SimpleStringLiteral node) {
+    SimpleStringLiteral toNode = this._toNode as SimpleStringLiteral;
+    if (javaBooleanAnd(isEqual3(node.literal, toNode.literal), identical(node.value, toNode.value))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitStringInterpolation(StringInterpolation node) {
+    StringInterpolation toNode = this._toNode as StringInterpolation;
+    if (isEqual2(node.elements, toNode.elements)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    SuperConstructorInvocation toNode = this._toNode as SuperConstructorInvocation;
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual3(node.period, toNode.period)), isEqual(node.constructorName, toNode.constructorName)), isEqual(node.argumentList, toNode.argumentList))) {
+      toNode.staticElement = node.staticElement;
+      return true;
+    }
+    return false;
+  }
+  bool visitSuperExpression(SuperExpression node) {
+    SuperExpression toNode = this._toNode as SuperExpression;
+    if (isEqual3(node.keyword, toNode.keyword)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitSwitchCase(SwitchCase node) {
+    SwitchCase toNode = this._toNode as SwitchCase;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual2(node.labels, toNode.labels), isEqual3(node.keyword, toNode.keyword)), isEqual(node.expression, toNode.expression)), isEqual3(node.colon, toNode.colon)), isEqual2(node.statements, toNode.statements));
+  }
+  bool visitSwitchDefault(SwitchDefault node) {
+    SwitchDefault toNode = this._toNode as SwitchDefault;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual2(node.labels, toNode.labels), isEqual3(node.keyword, toNode.keyword)), isEqual3(node.colon, toNode.colon)), isEqual2(node.statements, toNode.statements));
+  }
+  bool visitSwitchStatement(SwitchStatement node) {
+    SwitchStatement toNode = this._toNode as SwitchStatement;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual3(node.leftParenthesis, toNode.leftParenthesis)), isEqual(node.expression, toNode.expression)), isEqual3(node.rightParenthesis, toNode.rightParenthesis)), isEqual3(node.leftBracket, toNode.leftBracket)), isEqual2(node.members, toNode.members)), isEqual3(node.rightBracket, toNode.rightBracket));
+  }
+  bool visitSymbolLiteral(SymbolLiteral node) {
+    SymbolLiteral toNode = this._toNode as SymbolLiteral;
+    if (javaBooleanAnd(isEqual3(node.poundSign, toNode.poundSign), isEqual4(node.components, toNode.components))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitThisExpression(ThisExpression node) {
+    ThisExpression toNode = this._toNode as ThisExpression;
+    if (isEqual3(node.keyword, toNode.keyword)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitThrowExpression(ThrowExpression node) {
+    ThrowExpression toNode = this._toNode as ThrowExpression;
+    if (javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual(node.expression, toNode.expression))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    TopLevelVariableDeclaration toNode = this._toNode as TopLevelVariableDeclaration;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual(node.variables, toNode.variables)), isEqual3(node.semicolon, toNode.semicolon));
+  }
+  bool visitTryStatement(TryStatement node) {
+    TryStatement toNode = this._toNode as TryStatement;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.tryKeyword, toNode.tryKeyword), isEqual(node.body, toNode.body)), isEqual2(node.catchClauses, toNode.catchClauses)), isEqual3(node.finallyKeyword, toNode.finallyKeyword)), isEqual(node.finallyBlock, toNode.finallyBlock));
+  }
+  bool visitTypeArgumentList(TypeArgumentList node) {
+    TypeArgumentList toNode = this._toNode as TypeArgumentList;
+    return javaBooleanAnd(javaBooleanAnd(isEqual3(node.leftBracket, toNode.leftBracket), isEqual2(node.arguments, toNode.arguments)), isEqual3(node.rightBracket, toNode.rightBracket));
+  }
+  bool visitTypeName(TypeName node) {
+    TypeName toNode = this._toNode as TypeName;
+    if (javaBooleanAnd(isEqual(node.name, toNode.name), isEqual(node.typeArguments, toNode.typeArguments))) {
+      toNode.type = node.type;
+      return true;
+    }
+    return false;
+  }
+  bool visitTypeParameter(TypeParameter node) {
+    TypeParameter toNode = this._toNode as TypeParameter;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual(node.name, toNode.name)), isEqual3(node.keyword, toNode.keyword)), isEqual(node.bound, toNode.bound));
+  }
+  bool visitTypeParameterList(TypeParameterList node) {
+    TypeParameterList toNode = this._toNode as TypeParameterList;
+    return javaBooleanAnd(javaBooleanAnd(isEqual3(node.leftBracket, toNode.leftBracket), isEqual2(node.typeParameters, toNode.typeParameters)), isEqual3(node.rightBracket, toNode.rightBracket));
+  }
+  bool visitVariableDeclaration(VariableDeclaration node) {
+    VariableDeclaration toNode = this._toNode as VariableDeclaration;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual(node.name, toNode.name)), isEqual3(node.equals, toNode.equals)), isEqual(node.initializer, toNode.initializer));
+  }
+  bool visitVariableDeclarationList(VariableDeclarationList node) {
+    VariableDeclarationList toNode = this._toNode as VariableDeclarationList;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.keyword, toNode.keyword)), isEqual(node.type, toNode.type)), isEqual2(node.variables, toNode.variables));
+  }
+  bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    VariableDeclarationStatement toNode = this._toNode as VariableDeclarationStatement;
+    return javaBooleanAnd(isEqual(node.variables, toNode.variables), isEqual3(node.semicolon, toNode.semicolon));
+  }
+  bool visitWhileStatement(WhileStatement node) {
+    WhileStatement toNode = this._toNode as WhileStatement;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual3(node.leftParenthesis, toNode.leftParenthesis)), isEqual(node.condition, toNode.condition)), isEqual3(node.rightParenthesis, toNode.rightParenthesis)), isEqual(node.body, toNode.body));
+  }
+  bool visitWithClause(WithClause node) {
+    WithClause toNode = this._toNode as WithClause;
+    return javaBooleanAnd(isEqual3(node.withKeyword, toNode.withKeyword), isEqual2(node.mixinTypes, toNode.mixinTypes));
+  }
+
+  /**
+   * Return `true` if the given AST nodes have the same structure. As a side-effect, if the
+   * nodes do have the same structure, any resolution data from the first node will be copied to the
+   * second node.
+   *
+   * @param fromNode the node from which resolution information will be copied
+   * @param toNode the node to which resolution information will be copied
+   * @return `true` if the given AST nodes have the same structure
+   */
+  bool isEqual(ASTNode fromNode, ASTNode toNode) {
+    if (fromNode == null) {
+      return toNode == null;
+    } else if (toNode == null) {
+      return false;
+    } else if (fromNode.runtimeType == toNode.runtimeType) {
+      this._toNode = toNode;
+      return fromNode.accept(this);
+    }
+    if (toNode is PrefixedIdentifier) {
+      SimpleIdentifier prefix = ((toNode as PrefixedIdentifier)).prefix;
+      if (fromNode.runtimeType == prefix.runtimeType) {
+        this._toNode = prefix;
+        return fromNode.accept(this);
+      }
+    } else if (toNode is PropertyAccess) {
+      Expression target = ((toNode as PropertyAccess)).target;
+      if (fromNode.runtimeType == target.runtimeType) {
+        this._toNode = target;
+        return fromNode.accept(this);
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given lists of AST nodes have the same size and corresponding
+   * elements are equal.
+   *
+   * @param first the first node being compared
+   * @param second the second node being compared
+   * @return `true` if the given AST nodes have the same size and corresponding elements are
+   *         equal
+   */
+  bool isEqual2(NodeList first, NodeList second) {
+    if (first == null) {
+      return second == null;
+    } else if (second == null) {
+      return false;
+    }
+    int size = first.length;
+    if (second.length != size) {
+      return false;
+    }
+    bool equal = true;
+    for (int i = 0; i < size; i++) {
+      if (!isEqual(first[i], second[i])) {
+        equal = false;
+      }
+    }
+    return equal;
+  }
+
+  /**
+   * Return `true` if the given tokens have the same structure.
+   *
+   * @param first the first node being compared
+   * @param second the second node being compared
+   * @return `true` if the given tokens have the same structure
+   */
+  bool isEqual3(Token first, Token second) {
+    if (first == null) {
+      return second == null;
+    } else if (second == null) {
+      return false;
+    }
+    return first.lexeme == second.lexeme;
+  }
+
+  /**
+   * Return `true` if the given arrays of tokens have the same length and corresponding
+   * elements are equal.
+   *
+   * @param first the first node being compared
+   * @param second the second node being compared
+   * @return `true` if the given arrays of tokens have the same length and corresponding
+   *         elements are equal
+   */
+  bool isEqual4(List<Token> first, List<Token> second) {
+    int length = first.length;
+    if (second.length != length) {
+      return false;
+    }
+    for (int i = 0; i < length; i++) {
+      if (!isEqual3(first[i], second[i])) {
+        return false;
+      }
+    }
+    return true;
+  }
+}
+/**
  * Instances of the class {link ToFormattedSourceVisitor} write a source representation of a visited
  * AST node (and all of it's children) to a writer.
  */
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index bf066f2..ed27b38 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -3270,7 +3270,19 @@
     setMetadata(node.element, node);
     return null;
   }
-  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => null;
+  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    Expression expression = node.function;
+    if (expression is FunctionExpression) {
+      FunctionExpression functionExpression = expression as FunctionExpression;
+      ExecutableElement functionElement = functionExpression.element;
+      ArgumentList argumentList = node.argumentList;
+      List<ParameterElement> parameters = resolveArgumentsToParameters(false, argumentList, functionElement);
+      if (parameters != null) {
+        argumentList.correspondingStaticParameters = parameters;
+      }
+    }
+    return null;
+  }
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
     setMetadata(node.element, node);
     return null;
@@ -3491,6 +3503,10 @@
       if (element == null) {
         if (identifier.inSetterContext()) {
           _resolver.reportError5(StaticWarningCode.UNDEFINED_SETTER, identifier, [identifier.name, prefixElement.name]);
+        } else if (node.parent is Annotation) {
+          Annotation annotation = node.parent as Annotation;
+          _resolver.reportError5(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
+          return null;
         } else {
           _resolver.reportError5(StaticWarningCode.UNDEFINED_GETTER, identifier, [identifier.name, prefixElement.name]);
         }
@@ -3602,6 +3618,9 @@
     } else if (element == null || (element is PrefixElement && !isValidAsPrefix(node))) {
       if (isConstructorReturnType(node)) {
         _resolver.reportError5(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, node, []);
+      } else if (node.parent is Annotation) {
+        Annotation annotation = node.parent as Annotation;
+        _resolver.reportError5(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
       } else {
         _resolver.reportErrorProxyConditionalAnalysisError(_resolver.enclosingClass, StaticWarningCode.UNDEFINED_IDENTIFIER, node, [node.name]);
       }
@@ -7304,6 +7323,9 @@
   void promote(Expression expression, Type2 potentialType) {
     VariableElement element = getPromotionStaticElement(expression);
     if (element != null) {
+      if (((element as VariableElementImpl)).isPotentiallyMutatedInClosure) {
+        return;
+      }
       Type2 type = expression.staticType;
       if (type == null || type.isDynamic) {
         return;
@@ -7411,7 +7433,7 @@
    */
   void clearTypePromotionsIfAccessedInScopeAndProtentiallyMutated(ASTNode target) {
     for (Element element in promoteManager.promotedElements) {
-      if (((element as VariableElementImpl)).isPotentiallyMutated) {
+      if (((element as VariableElementImpl)).isPotentiallyMutatedInScope) {
         if (isVariableAccessedInClosure(element, target)) {
           promoteManager.setType(element, null);
         }
@@ -9069,7 +9091,11 @@
         staticType = _typeProvider.typeType;
       }
     } else if (staticElement is FunctionTypeAliasElement) {
-      staticType = ((staticElement as FunctionTypeAliasElement)).type;
+      if (isNotTypeLiteral(node)) {
+        staticType = ((staticElement as FunctionTypeAliasElement)).type;
+      } else {
+        staticType = _typeProvider.typeType;
+      }
     } else if (staticElement is MethodElement) {
       staticType = ((staticElement as MethodElement)).type;
     } else if (staticElement is PropertyAccessorElement) {
@@ -9268,7 +9294,11 @@
         staticType = _typeProvider.typeType;
       }
     } else if (element is FunctionTypeAliasElement) {
-      staticType = ((element as FunctionTypeAliasElement)).type;
+      if (isNotTypeLiteral(node)) {
+        staticType = ((element as FunctionTypeAliasElement)).type;
+      } else {
+        staticType = _typeProvider.typeType;
+      }
     } else if (element is MethodElement) {
       staticType = ((element as MethodElement)).type;
     } else if (element is PropertyAccessorElement) {
@@ -11401,6 +11431,12 @@
 class VariableResolverVisitor extends ScopedVisitor {
 
   /**
+   * The method or function that we are currently visiting, or `null` if we are not inside a
+   * method or function.
+   */
+  ExecutableElement _enclosingFunction;
+
+  /**
    * Initialize a newly created visitor to resolve the nodes in a compilation unit.
    *
    * @param library the library containing the compilation unit being resolved
@@ -11408,6 +11444,28 @@
    * @param typeProvider the object used to access the types from the core library
    */
   VariableResolverVisitor(Library library, Source source, TypeProvider typeProvider) : super.con1(library, source, typeProvider);
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    ExecutableElement outerFunction = _enclosingFunction;
+    try {
+      _enclosingFunction = node.element;
+      return super.visitFunctionDeclaration(node);
+    } finally {
+      _enclosingFunction = outerFunction;
+    }
+  }
+  Object visitFunctionExpression(FunctionExpression node) {
+    if (node.parent is! FunctionDeclaration) {
+      ExecutableElement outerFunction = _enclosingFunction;
+      try {
+        _enclosingFunction = node.element;
+        return super.visitFunctionExpression(node);
+      } finally {
+        _enclosingFunction = outerFunction;
+      }
+    } else {
+      return super.visitFunctionExpression(node);
+    }
+  }
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     if (node.staticElement != null) {
       return null;
@@ -11436,12 +11494,20 @@
     if (identical(kind, ElementKind.LOCAL_VARIABLE)) {
       node.staticElement = element;
       if (node.inSetterContext()) {
-        ((element as LocalVariableElementImpl)).markPotentiallyMutated();
+        LocalVariableElementImpl variableImpl = element as LocalVariableElementImpl;
+        variableImpl.markPotentiallyMutatedInScope();
+        if (element.enclosingElement != _enclosingFunction) {
+          variableImpl.markPotentiallyMutatedInClosure();
+        }
       }
     } else if (identical(kind, ElementKind.PARAMETER)) {
       node.staticElement = element;
       if (node.inSetterContext()) {
-        ((element as ParameterElementImpl)).markPotentiallyMutated();
+        ParameterElementImpl parameterImpl = element as ParameterElementImpl;
+        parameterImpl.markPotentiallyMutatedInScope();
+        if (_enclosingFunction != null && (element.enclosingElement != _enclosingFunction)) {
+          parameterImpl.markPotentiallyMutatedInClosure();
+        }
       }
     }
     return null;
@@ -11529,7 +11595,6 @@
   EnclosedScope(Scope enclosingScope) {
     this.enclosingScope = enclosingScope;
   }
-  LibraryElement get definingLibrary => enclosingScope.definingLibrary;
   AnalysisErrorListener get errorListener => enclosingScope.errorListener;
 
   /**
@@ -11552,7 +11617,7 @@
       return element;
     }
     if (_hiddenNames.contains(name)) {
-      errorListener.onError(new AnalysisError.con2(source, identifier.offset, identifier.length, CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, []));
+      errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, []));
     }
     return enclosingScope.lookup3(identifier, name, referencingLibrary);
   }
@@ -11770,7 +11835,6 @@
       super.define(element);
     }
   }
-  LibraryElement get definingLibrary => _definingLibrary;
   AnalysisErrorListener get errorListener => _errorListener;
   Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) {
     Element foundElement = localLookup(name, referencingLibrary);
@@ -11795,7 +11859,7 @@
       List<Element> conflictingMembers = ((foundElement as MultiplyDefinedElementImpl)).conflictingElements;
       String libName1 = getLibraryName(conflictingMembers[0], "");
       String libName2 = getLibraryName(conflictingMembers[1], "");
-      _errorListener.onError(new AnalysisError.con2(getSource2(identifier), identifier.offset, identifier.length, StaticWarningCode.AMBIGUOUS_IMPORT, [foundEltName, libName1, libName2]));
+      _errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, StaticWarningCode.AMBIGUOUS_IMPORT, [foundEltName, libName1, libName2]));
       return foundElement;
     }
     if (foundElement != null) {
@@ -11837,27 +11901,6 @@
   }
 
   /**
-   * Return the source that contains the given identifier, or the source associated with this scope
-   * if the source containing the identifier could not be determined.
-   *
-   * @param identifier the identifier whose source is to be returned
-   * @return the source that contains the given identifier
-   */
-  Source getSource2(Identifier identifier) {
-    CompilationUnit unit = identifier.getAncestor(CompilationUnit);
-    if (unit != null) {
-      CompilationUnitElement element = unit.element;
-      if (element != null) {
-        Source source = element.source;
-        if (source != null) {
-          return source;
-        }
-      }
-    }
-    return this.source;
-  }
-
-  /**
    * Given a collection of elements that a single name could all be mapped to, remove from the list
    * all of the names defined in the SDK. Return the element(s) that remain.
    *
@@ -11882,7 +11925,7 @@
     if (sdkElement != null && to > 0) {
       String sdkLibName = getLibraryName(sdkElement, "");
       String otherLibName = getLibraryName(conflictingMembers[0], "");
-      _errorListener.onError(new AnalysisError.con2(getSource2(identifier), identifier.offset, identifier.length, StaticWarningCode.CONFLICTING_DART_IMPORT, [name, sdkLibName, otherLibName]));
+      _errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, StaticWarningCode.CONFLICTING_DART_IMPORT, [name, sdkLibName, otherLibName]));
     }
     if (to == length) {
       return foundElement;
@@ -11923,7 +11966,7 @@
           offset = accessor.variable.nameOffset;
         }
       }
-      return new AnalysisError.con2(source, offset, duplicate.displayName.length, CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER, [existing.displayName]);
+      return new AnalysisError.con2(duplicate.source, offset, duplicate.displayName.length, CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER, [existing.displayName]);
     }
     return super.getErrorForDuplicate(existing, duplicate);
   }
@@ -12326,13 +12369,6 @@
   }
 
   /**
-   * Return the element representing the library in which this scope is enclosed.
-   *
-   * @return the element representing the library in which this scope is enclosed
-   */
-  LibraryElement get definingLibrary;
-
-  /**
    * Return the error code to be used when reporting that a name being defined locally conflicts
    * with another element of the same name in the local scope.
    *
@@ -12342,9 +12378,6 @@
    */
   AnalysisError getErrorForDuplicate(Element existing, Element duplicate) {
     Source source = duplicate.source;
-    if (source == null) {
-      source = this.source;
-    }
     return new AnalysisError.con2(source, duplicate.nameOffset, duplicate.displayName.length, CompileTimeErrorCode.DUPLICATE_DEFINITION, [existing.displayName]);
   }
 
@@ -12356,12 +12389,22 @@
   AnalysisErrorListener get errorListener;
 
   /**
-   * Return the source object representing the compilation unit with which errors related to this
-   * scope should be associated.
+   * Return the source that contains the given identifier, or the source associated with this scope
+   * if the source containing the identifier could not be determined.
    *
-   * @return the source object with which errors should be associated
+   * @param identifier the identifier whose source is to be returned
+   * @return the source that contains the given identifier
    */
-  Source get source => definingLibrary.definingCompilationUnit.source;
+  Source getSource(ASTNode node) {
+    CompilationUnit unit = node.getAncestor(CompilationUnit);
+    if (unit != null) {
+      CompilationUnitElement unitElement = unit.element;
+      if (unitElement != null) {
+        return unitElement.source;
+      }
+    }
+    return null;
+  }
 
   /**
    * Return the element with which the given name is associated, or `null` if the name is not
@@ -13386,7 +13429,6 @@
     return super.visitSimpleFormalParameter(node);
   }
   Object visitSimpleIdentifier(SimpleIdentifier node) {
-    checkForReferenceToDeclaredVariableInInitializer(node);
     checkForImplicitThisReferenceInInitializer(node);
     if (!isUnqualifiedReferenceToNonLocalStaticMemberAllowed(node)) {
       checkForUnqualifiedReferenceToNonLocalStaticMember(node);
@@ -16274,54 +16316,6 @@
   }
 
   /**
-   * This checks if the passed identifier is banned because it is part of the variable declaration
-   * with the same name.
-   *
-   * @param node the identifier to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER
-   */
-  bool checkForReferenceToDeclaredVariableInInitializer(SimpleIdentifier node) {
-    ASTNode parent = node.parent;
-    if (parent is PrefixedIdentifier) {
-      PrefixedIdentifier prefixedIdentifier = parent as PrefixedIdentifier;
-      if (identical(prefixedIdentifier.identifier, node)) {
-        return false;
-      }
-    }
-    if (parent is PropertyAccess) {
-      PropertyAccess propertyAccess = parent as PropertyAccess;
-      if (identical(propertyAccess.propertyName, node)) {
-        return false;
-      }
-    }
-    if (parent is MethodInvocation) {
-      MethodInvocation methodInvocation = parent as MethodInvocation;
-      if (methodInvocation.target != null && identical(methodInvocation.methodName, node)) {
-        return false;
-      }
-    }
-    if (parent is ConstructorName) {
-      ConstructorName constructorName = parent as ConstructorName;
-      if (identical(constructorName.name, node)) {
-        return false;
-      }
-    }
-    if (parent is Label) {
-      Label label = parent as Label;
-      if (identical(label.label, node)) {
-        return false;
-      }
-    }
-    String name = node.name;
-    if (!_namesForReferenceToDeclaredVariableInInitializer.contains(name)) {
-      return false;
-    }
-    _errorReporter.reportError2(CompileTimeErrorCode.REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER, node, [name]);
-    return true;
-  }
-
-  /**
    * This checks that the rethrow is inside of a catch clause.
    *
    * @param node the rethrow expression to evaluate
@@ -16973,6 +16967,12 @@
     if (parent is Annotation && identical(((parent as Annotation)).constructorName, node)) {
       return true;
     }
+    if (parent is CommentReference) {
+      CommentReference commentReference = parent as CommentReference;
+      if (commentReference.newKeyword != null) {
+        return true;
+      }
+    }
     return false;
   }
 
diff --git a/pkg/analyzer/lib/src/generated/scanner.dart b/pkg/analyzer/lib/src/generated/scanner.dart
index e60e57a..3e93f73 100644
--- a/pkg/analyzer/lib/src/generated/scanner.dart
+++ b/pkg/analyzer/lib/src/generated/scanner.dart
@@ -137,15 +137,13 @@
  * @coverage dart.engine.parser
  */
 class ScannerErrorCode extends Enum<ScannerErrorCode> implements ErrorCode {
-  static final ScannerErrorCode CHARACTER_EXPECTED_AFTER_SLASH = new ScannerErrorCode.con1('CHARACTER_EXPECTED_AFTER_SLASH', 0, "Character expected after slash");
-  static final ScannerErrorCode ILLEGAL_CHARACTER = new ScannerErrorCode.con1('ILLEGAL_CHARACTER', 1, "Illegal character %x");
-  static final ScannerErrorCode MISSING_DIGIT = new ScannerErrorCode.con1('MISSING_DIGIT', 2, "Decimal digit expected");
-  static final ScannerErrorCode MISSING_HEX_DIGIT = new ScannerErrorCode.con1('MISSING_HEX_DIGIT', 3, "Hexidecimal digit expected");
-  static final ScannerErrorCode MISSING_QUOTE = new ScannerErrorCode.con1('MISSING_QUOTE', 4, "Expected quote (' or \")");
-  static final ScannerErrorCode UNTERMINATED_MULTI_LINE_COMMENT = new ScannerErrorCode.con1('UNTERMINATED_MULTI_LINE_COMMENT', 5, "Unterminated multi-line comment");
-  static final ScannerErrorCode UNTERMINATED_STRING_LITERAL = new ScannerErrorCode.con1('UNTERMINATED_STRING_LITERAL', 6, "Unterminated string literal");
+  static final ScannerErrorCode ILLEGAL_CHARACTER = new ScannerErrorCode.con1('ILLEGAL_CHARACTER', 0, "Illegal character %x");
+  static final ScannerErrorCode MISSING_DIGIT = new ScannerErrorCode.con1('MISSING_DIGIT', 1, "Decimal digit expected");
+  static final ScannerErrorCode MISSING_HEX_DIGIT = new ScannerErrorCode.con1('MISSING_HEX_DIGIT', 2, "Hexidecimal digit expected");
+  static final ScannerErrorCode MISSING_QUOTE = new ScannerErrorCode.con1('MISSING_QUOTE', 3, "Expected quote (' or \")");
+  static final ScannerErrorCode UNTERMINATED_MULTI_LINE_COMMENT = new ScannerErrorCode.con1('UNTERMINATED_MULTI_LINE_COMMENT', 4, "Unterminated multi-line comment");
+  static final ScannerErrorCode UNTERMINATED_STRING_LITERAL = new ScannerErrorCode.con1('UNTERMINATED_STRING_LITERAL', 5, "Unterminated string literal");
   static final List<ScannerErrorCode> values = [
-      CHARACTER_EXPECTED_AFTER_SLASH,
       ILLEGAL_CHARACTER,
       MISSING_DIGIT,
       MISSING_HEX_DIGIT,
@@ -469,7 +467,19 @@
   /**
    * A map from tokens that were copied to the copies of the tokens.
    */
-  TokenMap _tokenMap = new TokenMap();
+  final TokenMap tokenMap = new TokenMap();
+
+  /**
+   * The first token in the range of tokens that are different from the tokens in the original token
+   * stream.
+   */
+  Token _firstToken;
+
+  /**
+   * The last token in the range of tokens that are different from the tokens in the original token
+   * stream.
+   */
+  Token lastToken;
 
   /**
    * Initialize a newly created scanner.
@@ -483,6 +493,15 @@
   }
 
   /**
+   * Return the first token in the range of tokens that are different from the tokens in the
+   * original token stream or `null` if the new tokens are the same as the original tokens
+   * except for offset.
+   *
+   * @return the first token in the range of new tokens
+   */
+  Token get firstToken => _firstToken;
+
+  /**
    * Given the stream of tokens scanned from the original source, the modified source (the result of
    * replacing one contiguous range of characters with another string of characters), and a
    * specification of the modification that was made, return a stream of tokens scanned from the
@@ -495,16 +514,32 @@
    * @param insertedLength the number of characters added to the modified source
    */
   Token rescan(Token originalStream, int index, int removedLength, int insertedLength) {
-    while (originalStream.end < index) {
+    while (originalStream.type != TokenType.EOF && originalStream.end < index) {
       originalStream = copyAndAdvance(originalStream, 0);
     }
+    Token lastCopied = tail;
     int modifiedEnd = index + insertedLength - 1;
+    if (originalStream.offset < index) {
+      modifiedEnd += originalStream.end - index - removedLength;
+    }
     _reader.offset = Math.min(originalStream.offset, index) - 1;
     int next = _reader.advance();
     while (next != -1 && _reader.offset <= modifiedEnd) {
       next = bigSwitch(next);
     }
-    int removedEnd = index + removedLength - 1;
+    _firstToken = lastCopied.next;
+    lastToken = tail;
+    if (_firstToken == null || identical(_firstToken.type, TokenType.EOF)) {
+      _firstToken = null;
+      lastToken = null;
+    } else if (originalStream.end == index && _firstToken.end == index) {
+      tokenMap.put(originalStream, _firstToken);
+      if (identical(lastToken, _firstToken)) {
+        lastToken = lastToken.next;
+      }
+      _firstToken = _firstToken.next;
+    }
+    int removedEnd = index + removedLength - 1 + Math.max(0, tail.end - index - insertedLength);
     while (originalStream.offset <= removedEnd) {
       originalStream = originalStream.next;
     }
@@ -512,18 +547,19 @@
     while (originalStream.type != TokenType.EOF) {
       originalStream = copyAndAdvance(originalStream, delta);
     }
-    copyAndAdvance(originalStream, delta);
-    return firstToken();
+    Token eof = copyAndAdvance(originalStream, delta);
+    eof.setNextWithoutSettingPrevious(eof);
+    return super.firstToken;
   }
   Token copyAndAdvance(Token originalToken, int delta) {
     Token copiedToken = originalToken.copy();
-    _tokenMap.put(originalToken, copiedToken);
+    tokenMap.put(originalToken, copiedToken);
     copiedToken.applyDelta(delta);
     appendToken(copiedToken);
     Token originalComment = originalToken.precedingComments;
     Token copiedComment = originalToken.precedingComments;
     while (originalComment != null) {
-      _tokenMap.put(originalComment, copiedComment);
+      tokenMap.put(originalComment, copiedComment);
       originalComment = originalComment.next;
       copiedComment = copiedComment.next;
     }
@@ -566,7 +602,7 @@
   /**
    * The last token that was scanned.
    */
-  Token _tail;
+  Token tail;
 
   /**
    * The first token in the list of comment tokens found since the last non-comment token.
@@ -617,7 +653,7 @@
     this._errorListener = errorListener;
     _tokens = new Token(TokenType.EOF, -1);
     _tokens.setNext(_tokens);
-    _tail = _tokens;
+    tail = _tokens;
     _tokenStart = -1;
     _lineStarts.add(0);
   }
@@ -674,7 +710,7 @@
       }
       appendEofToken();
       instrumentation.metric2("tokensCount", tokenCounter);
-      return firstToken();
+      return firstToken;
     } finally {
       instrumentation.log2(2);
     }
@@ -688,7 +724,7 @@
    * @param token the token to be appended
    */
   void appendToken(Token token) {
-    _tail = _tail.setNext(token);
+    tail = tail.setNext(token);
   }
   int bigSwitch(int next) {
     beginToken();
@@ -836,7 +872,7 @@
    *
    * @return the first token in the token stream that was scanned
    */
-  Token firstToken() => _tokens.next;
+  Token get firstToken => _tokens.next;
 
   /**
    * Record the fact that we are at the beginning of a new line in the source.
@@ -853,7 +889,7 @@
       _firstComment = null;
       _lastComment = null;
     }
-    _tail = _tail.setNext(token);
+    tail = tail.setNext(token);
     _groupingStack.add(token);
     _stackEnd++;
   }
@@ -874,7 +910,7 @@
       _firstComment = null;
       _lastComment = null;
     }
-    _tail = _tail.setNext(token);
+    tail = tail.setNext(token);
     if (_stackEnd >= 0) {
       BeginToken begin = _groupingStack[_stackEnd];
       if (identical(begin.type, beginType)) {
@@ -893,52 +929,52 @@
       _lastComment = null;
     }
     eofToken.setNext(eofToken);
-    _tail = _tail.setNext(eofToken);
+    tail = tail.setNext(eofToken);
     if (_stackEnd >= 0) {
       _hasUnmatchedGroups2 = true;
     }
   }
   void appendKeywordToken(Keyword keyword) {
     if (_firstComment == null) {
-      _tail = _tail.setNext(new KeywordToken(keyword, _tokenStart));
+      tail = tail.setNext(new KeywordToken(keyword, _tokenStart));
     } else {
-      _tail = _tail.setNext(new KeywordTokenWithComment(keyword, _tokenStart, _firstComment));
+      tail = tail.setNext(new KeywordTokenWithComment(keyword, _tokenStart, _firstComment));
       _firstComment = null;
       _lastComment = null;
     }
   }
   void appendStringToken(TokenType type, String value) {
     if (_firstComment == null) {
-      _tail = _tail.setNext(new StringToken(type, value, _tokenStart));
+      tail = tail.setNext(new StringToken(type, value, _tokenStart));
     } else {
-      _tail = _tail.setNext(new StringTokenWithComment(type, value, _tokenStart, _firstComment));
+      tail = tail.setNext(new StringTokenWithComment(type, value, _tokenStart, _firstComment));
       _firstComment = null;
       _lastComment = null;
     }
   }
   void appendStringToken2(TokenType type, String value, int offset) {
     if (_firstComment == null) {
-      _tail = _tail.setNext(new StringToken(type, value, _tokenStart + offset));
+      tail = tail.setNext(new StringToken(type, value, _tokenStart + offset));
     } else {
-      _tail = _tail.setNext(new StringTokenWithComment(type, value, _tokenStart + offset, _firstComment));
+      tail = tail.setNext(new StringTokenWithComment(type, value, _tokenStart + offset, _firstComment));
       _firstComment = null;
       _lastComment = null;
     }
   }
   void appendToken2(TokenType type) {
     if (_firstComment == null) {
-      _tail = _tail.setNext(new Token(type, _tokenStart));
+      tail = tail.setNext(new Token(type, _tokenStart));
     } else {
-      _tail = _tail.setNext(new TokenWithComment(type, _tokenStart, _firstComment));
+      tail = tail.setNext(new TokenWithComment(type, _tokenStart, _firstComment));
       _firstComment = null;
       _lastComment = null;
     }
   }
   void appendToken3(TokenType type, int offset) {
     if (_firstComment == null) {
-      _tail = _tail.setNext(new Token(type, offset));
+      tail = tail.setNext(new Token(type, offset));
     } else {
-      _tail = _tail.setNext(new TokenWithComment(type, offset, _firstComment));
+      tail = tail.setNext(new TokenWithComment(type, offset, _firstComment));
       _firstComment = null;
       _lastComment = null;
     }
@@ -1337,24 +1373,18 @@
         if (next == -1) {
           break;
         }
-        bool missingCharacter = false;
         if (next == 0xD) {
-          missingCharacter = true;
           next = _reader.advance();
           if (next == 0xA) {
             next = _reader.advance();
           }
           recordStartOfLine();
         } else if (next == 0xA) {
-          missingCharacter = true;
           recordStartOfLine();
           next = _reader.advance();
         } else {
           next = _reader.advance();
         }
-        if (missingCharacter) {
-          _errorListener.onError(new AnalysisError.con2(source, _reader.offset - 1, 1, ScannerErrorCode.CHARACTER_EXPECTED_AFTER_SLASH, []));
-        }
       } else if (next == 0xD) {
         next = _reader.advance();
         if (next == 0xA) {
@@ -1740,6 +1770,7 @@
     token = token.next;
     while (token != null) {
       tail = tail.setNext(token.copy());
+      token = token.next;
     }
     return head;
   }
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 1df9ef8..ae88fb2 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,11 +1,11 @@
 name: analyzer
-version: 0.9.1
+version: 0.10.0
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
 dependencies:
-  args: ">=0.8.6"
-  logging: ">=0.8.6"
-  path: ">=0.8.6"
+  args: ">=0.8.9 <1.0.0"
+  logging: ">=0.8.9 <1.0.0"
+  path: ">=0.8.9 <1.0.0"
 dev_dependencies:
-  unittest: ">=0.8.6"
+  unittest: ">=0.8.9 <1.0.0"
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 0ceef47..e8f3dad 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -4,14 +4,17 @@
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/java_junit.dart';
 import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/source.dart' show Source;
 import 'package:analyzer/src/generated/scanner.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/parser.dart';
+import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:unittest/unittest.dart' as _ut;
 import 'test_support.dart';
 import 'scanner_test.dart' show TokenFactory;
 import 'ast_test.dart' show ASTFactory;
+import 'element_test.dart' show ElementFactory;
 /**
  * The class `SimpleParserTest` defines parser tests that test individual parsing method. The
  * code fragments should be as minimal as possible in order to test the method, but should not test
@@ -473,6 +476,14 @@
     EngineTestCase.assertInstanceOf(IndexExpression, section.function);
     JUnitTestCase.assertNotNull(section.argumentList);
   }
+  void test_parseCascadeSection_ii() {
+    MethodInvocation section = ParserTestCase.parse5("parseCascadeSection", "..a(b).c(d)", []);
+    EngineTestCase.assertInstanceOf(MethodInvocation, section.target);
+    JUnitTestCase.assertNotNull(section.period);
+    JUnitTestCase.assertNotNull(section.methodName);
+    JUnitTestCase.assertNotNull(section.argumentList);
+    EngineTestCase.assertSize(1, section.argumentList.arguments);
+  }
   void test_parseCascadeSection_p() {
     PropertyAccess section = ParserTestCase.parse5("parseCascadeSection", "..a", []);
     JUnitTestCase.assertNull(section.target);
@@ -515,7 +526,7 @@
   }
   void test_parseCascadeSection_paapaa() {
     FunctionExpressionInvocation section = ParserTestCase.parse5("parseCascadeSection", "..a(b)(c).d(e)(f)", []);
-    EngineTestCase.assertInstanceOf(FunctionExpressionInvocation, section.function);
+    EngineTestCase.assertInstanceOf(MethodInvocation, section.function);
     JUnitTestCase.assertNotNull(section.argumentList);
     EngineTestCase.assertSize(1, section.argumentList.arguments);
   }
@@ -4297,6 +4308,10 @@
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseCascadeSection_ia);
       });
+      _ut.test('test_parseCascadeSection_ii', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_parseCascadeSection_ii);
+      });
       _ut.test('test_parseCascadeSection_p', () {
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseCascadeSection_p);
@@ -6759,6 +6774,698 @@
     });
   }
 }
+class ResolutionCopierTest extends EngineTestCase {
+  void test_visitAnnotation() {
+    String annotationName = "proxy";
+    Annotation fromNode = ASTFactory.annotation(ASTFactory.identifier3(annotationName));
+    Element element = ElementFactory.topLevelVariableElement2(annotationName);
+    fromNode.element = element;
+    Annotation toNode = ASTFactory.annotation(ASTFactory.identifier3(annotationName));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(element, toNode.element);
+  }
+  void test_visitArgumentDefinitionTest() {
+    String identifier = "p";
+    ArgumentDefinitionTest fromNode = ASTFactory.argumentDefinitionTest(identifier);
+    Type2 propagatedType = ElementFactory.classElement2("A", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("B", []).type;
+    fromNode.staticType = staticType;
+    ArgumentDefinitionTest toNode = ASTFactory.argumentDefinitionTest(identifier);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitAsExpression() {
+    AsExpression fromNode = ASTFactory.asExpression(ASTFactory.identifier3("x"), ASTFactory.typeName4("A", []));
+    Type2 propagatedType = ElementFactory.classElement2("A", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("B", []).type;
+    fromNode.staticType = staticType;
+    AsExpression toNode = ASTFactory.asExpression(ASTFactory.identifier3("x"), ASTFactory.typeName4("A", []));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitAssignmentExpression() {
+    AssignmentExpression fromNode = ASTFactory.assignmentExpression(ASTFactory.identifier3("a"), TokenType.PLUS_EQ, ASTFactory.identifier3("b"));
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    MethodElement propagatedElement = ElementFactory.methodElement("+", propagatedType, []);
+    fromNode.propagatedElement = propagatedElement;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    MethodElement staticElement = ElementFactory.methodElement("+", staticType, []);
+    fromNode.staticElement = staticElement;
+    fromNode.staticType = staticType;
+    AssignmentExpression toNode = ASTFactory.assignmentExpression(ASTFactory.identifier3("a"), TokenType.PLUS_EQ, ASTFactory.identifier3("b"));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitBinaryExpression() {
+    BinaryExpression fromNode = ASTFactory.binaryExpression(ASTFactory.identifier3("a"), TokenType.PLUS, ASTFactory.identifier3("b"));
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    MethodElement propagatedElement = ElementFactory.methodElement("+", propagatedType, []);
+    fromNode.propagatedElement = propagatedElement;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    MethodElement staticElement = ElementFactory.methodElement("+", staticType, []);
+    fromNode.staticElement = staticElement;
+    fromNode.staticType = staticType;
+    BinaryExpression toNode = ASTFactory.binaryExpression(ASTFactory.identifier3("a"), TokenType.PLUS, ASTFactory.identifier3("b"));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitBooleanLiteral() {
+    BooleanLiteral fromNode = ASTFactory.booleanLiteral(true);
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    BooleanLiteral toNode = ASTFactory.booleanLiteral(true);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitCascadeExpression() {
+    CascadeExpression fromNode = ASTFactory.cascadeExpression(ASTFactory.identifier3("a"), [ASTFactory.identifier3("b")]);
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    CascadeExpression toNode = ASTFactory.cascadeExpression(ASTFactory.identifier3("a"), [ASTFactory.identifier3("b")]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitCompilationUnit() {
+    CompilationUnit fromNode = ASTFactory.compilationUnit();
+    CompilationUnitElement element = new CompilationUnitElementImpl("test.dart");
+    fromNode.element = element;
+    CompilationUnit toNode = ASTFactory.compilationUnit();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(element, toNode.element);
+  }
+  void test_visitConditionalExpression() {
+    ConditionalExpression fromNode = ASTFactory.conditionalExpression(ASTFactory.identifier3("c"), ASTFactory.identifier3("a"), ASTFactory.identifier3("b"));
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    ConditionalExpression toNode = ASTFactory.conditionalExpression(ASTFactory.identifier3("c"), ASTFactory.identifier3("a"), ASTFactory.identifier3("b"));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitConstructorDeclaration() {
+    String className = "A";
+    String constructorName = "c";
+    ConstructorDeclaration fromNode = ASTFactory.constructorDeclaration(ASTFactory.identifier3(className), constructorName, ASTFactory.formalParameterList([]), null);
+    ConstructorElement element = ElementFactory.constructorElement(ElementFactory.classElement2(className, []), constructorName);
+    fromNode.element = element;
+    ConstructorDeclaration toNode = ASTFactory.constructorDeclaration(ASTFactory.identifier3(className), constructorName, ASTFactory.formalParameterList([]), null);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(element, toNode.element);
+  }
+  void test_visitConstructorName() {
+    ConstructorName fromNode = ASTFactory.constructorName(ASTFactory.typeName4("A", []), "c");
+    ConstructorElement staticElement = ElementFactory.constructorElement(ElementFactory.classElement2("A", []), "c");
+    fromNode.staticElement = staticElement;
+    ConstructorName toNode = ASTFactory.constructorName(ASTFactory.typeName4("A", []), "c");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+  }
+  void test_visitDoubleLiteral() {
+    DoubleLiteral fromNode = ASTFactory.doubleLiteral(1.0);
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    DoubleLiteral toNode = ASTFactory.doubleLiteral(1.0);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitExportDirective() {
+    ExportDirective fromNode = ASTFactory.exportDirective2("dart:uri", []);
+    ExportElement element = new ExportElementImpl();
+    fromNode.element = element;
+    ExportDirective toNode = ASTFactory.exportDirective2("dart:uri", []);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(element, toNode.element);
+  }
+  void test_visitFunctionExpression() {
+    FunctionExpression fromNode = ASTFactory.functionExpression2(ASTFactory.formalParameterList([]), ASTFactory.emptyFunctionBody());
+    MethodElement element = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
+    fromNode.element = element;
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    FunctionExpression toNode = ASTFactory.functionExpression2(ASTFactory.formalParameterList([]), ASTFactory.emptyFunctionBody());
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(element, toNode.element);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitFunctionExpressionInvocation() {
+    FunctionExpressionInvocation fromNode = ASTFactory.functionExpressionInvocation(ASTFactory.identifier3("f"), []);
+    MethodElement propagatedElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
+    fromNode.propagatedElement = propagatedElement;
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    MethodElement staticElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
+    fromNode.staticElement = staticElement;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    FunctionExpressionInvocation toNode = ASTFactory.functionExpressionInvocation(ASTFactory.identifier3("f"), []);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitImportDirective() {
+    ImportDirective fromNode = ASTFactory.importDirective2("dart:uri", null, []);
+    ImportElement element = new ImportElementImpl();
+    fromNode.element = element;
+    ImportDirective toNode = ASTFactory.importDirective2("dart:uri", null, []);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(element, toNode.element);
+  }
+  void test_visitIndexExpression() {
+    IndexExpression fromNode = ASTFactory.indexExpression(ASTFactory.identifier3("a"), ASTFactory.integer(0));
+    MethodElement propagatedElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
+    MethodElement staticElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
+    AuxiliaryElements auxiliaryElements = new AuxiliaryElements(staticElement, propagatedElement);
+    fromNode.auxiliaryElements = auxiliaryElements;
+    fromNode.propagatedElement = propagatedElement;
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    fromNode.staticElement = staticElement;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    IndexExpression toNode = ASTFactory.indexExpression(ASTFactory.identifier3("a"), ASTFactory.integer(0));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(auxiliaryElements, toNode.auxiliaryElements);
+    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitInstanceCreationExpression() {
+    InstanceCreationExpression fromNode = ASTFactory.instanceCreationExpression2(Keyword.NEW, ASTFactory.typeName4("C", []), []);
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    ConstructorElement staticElement = ElementFactory.constructorElement(ElementFactory.classElement2("C", []), null);
+    fromNode.staticElement = staticElement;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    InstanceCreationExpression toNode = ASTFactory.instanceCreationExpression2(Keyword.NEW, ASTFactory.typeName4("C", []), []);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitIntegerLiteral() {
+    IntegerLiteral fromNode = ASTFactory.integer(2);
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    IntegerLiteral toNode = ASTFactory.integer(2);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitIsExpression() {
+    IsExpression fromNode = ASTFactory.isExpression(ASTFactory.identifier3("x"), false, ASTFactory.typeName4("A", []));
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    IsExpression toNode = ASTFactory.isExpression(ASTFactory.identifier3("x"), false, ASTFactory.typeName4("A", []));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitLibraryIdentifier() {
+    LibraryIdentifier fromNode = ASTFactory.libraryIdentifier([ASTFactory.identifier3("lib")]);
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    LibraryIdentifier toNode = ASTFactory.libraryIdentifier([ASTFactory.identifier3("lib")]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitListLiteral() {
+    ListLiteral fromNode = ASTFactory.listLiteral([]);
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    ListLiteral toNode = ASTFactory.listLiteral([]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitMapLiteral() {
+    MapLiteral fromNode = ASTFactory.mapLiteral2([]);
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    MapLiteral toNode = ASTFactory.mapLiteral2([]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitMethodInvocation() {
+    MethodInvocation fromNode = ASTFactory.methodInvocation2("m", []);
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    MethodInvocation toNode = ASTFactory.methodInvocation2("m", []);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitNamedExpression() {
+    NamedExpression fromNode = ASTFactory.namedExpression2("n", ASTFactory.integer(0));
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    NamedExpression toNode = ASTFactory.namedExpression2("n", ASTFactory.integer(0));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitNullLiteral() {
+    NullLiteral fromNode = ASTFactory.nullLiteral();
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    NullLiteral toNode = ASTFactory.nullLiteral();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitParenthesizedExpression() {
+    ParenthesizedExpression fromNode = ASTFactory.parenthesizedExpression(ASTFactory.integer(0));
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    ParenthesizedExpression toNode = ASTFactory.parenthesizedExpression(ASTFactory.integer(0));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitPartDirective() {
+    PartDirective fromNode = ASTFactory.partDirective2("part.dart");
+    LibraryElement element = new LibraryElementImpl(null, ASTFactory.libraryIdentifier2(["lib"]));
+    fromNode.element = element;
+    PartDirective toNode = ASTFactory.partDirective2("part.dart");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(element, toNode.element);
+  }
+  void test_visitPartOfDirective() {
+    PartOfDirective fromNode = ASTFactory.partOfDirective(ASTFactory.libraryIdentifier2(["lib"]));
+    LibraryElement element = new LibraryElementImpl(null, ASTFactory.libraryIdentifier2(["lib"]));
+    fromNode.element = element;
+    PartOfDirective toNode = ASTFactory.partOfDirective(ASTFactory.libraryIdentifier2(["lib"]));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(element, toNode.element);
+  }
+  void test_visitPostfixExpression() {
+    String variableName = "x";
+    PostfixExpression fromNode = ASTFactory.postfixExpression(ASTFactory.identifier3(variableName), TokenType.PLUS_PLUS);
+    MethodElement propagatedElement = ElementFactory.methodElement("+", ElementFactory.classElement2("C", []).type, []);
+    fromNode.propagatedElement = propagatedElement;
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    MethodElement staticElement = ElementFactory.methodElement("+", ElementFactory.classElement2("C", []).type, []);
+    fromNode.staticElement = staticElement;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    PostfixExpression toNode = ASTFactory.postfixExpression(ASTFactory.identifier3(variableName), TokenType.PLUS_PLUS);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitPrefixedIdentifier() {
+    PrefixedIdentifier fromNode = ASTFactory.identifier5("p", "f");
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    PrefixedIdentifier toNode = ASTFactory.identifier5("p", "f");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitPrefixExpression() {
+    PrefixExpression fromNode = ASTFactory.prefixExpression(TokenType.PLUS_PLUS, ASTFactory.identifier3("x"));
+    MethodElement propagatedElement = ElementFactory.methodElement("+", ElementFactory.classElement2("C", []).type, []);
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedElement = propagatedElement;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    MethodElement staticElement = ElementFactory.methodElement("+", ElementFactory.classElement2("C", []).type, []);
+    fromNode.staticElement = staticElement;
+    fromNode.staticType = staticType;
+    PrefixExpression toNode = ASTFactory.prefixExpression(TokenType.PLUS_PLUS, ASTFactory.identifier3("x"));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitPropertyAccess() {
+    PropertyAccess fromNode = ASTFactory.propertyAccess2(ASTFactory.identifier3("x"), "y");
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    PropertyAccess toNode = ASTFactory.propertyAccess2(ASTFactory.identifier3("x"), "y");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitRedirectingConstructorInvocation() {
+    RedirectingConstructorInvocation fromNode = ASTFactory.redirectingConstructorInvocation([]);
+    ConstructorElement staticElement = ElementFactory.constructorElement(ElementFactory.classElement2("C", []), null);
+    fromNode.staticElement = staticElement;
+    RedirectingConstructorInvocation toNode = ASTFactory.redirectingConstructorInvocation([]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+  }
+  void test_visitRethrowExpression() {
+    RethrowExpression fromNode = ASTFactory.rethrowExpression();
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    RethrowExpression toNode = ASTFactory.rethrowExpression();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitSimpleIdentifier() {
+    SimpleIdentifier fromNode = ASTFactory.identifier3("x");
+    MethodElement propagatedElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
+    MethodElement staticElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
+    AuxiliaryElements auxiliaryElements = new AuxiliaryElements(staticElement, propagatedElement);
+    fromNode.auxiliaryElements = auxiliaryElements;
+    fromNode.propagatedElement = propagatedElement;
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    fromNode.staticElement = staticElement;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    SimpleIdentifier toNode = ASTFactory.identifier3("x");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(auxiliaryElements, toNode.auxiliaryElements);
+    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitSimpleStringLiteral() {
+    SimpleStringLiteral fromNode = ASTFactory.string2("abc");
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    SimpleStringLiteral toNode = ASTFactory.string2("abc");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitStringInterpolation() {
+    StringInterpolation fromNode = ASTFactory.string([ASTFactory.interpolationString("a", "'a'")]);
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    StringInterpolation toNode = ASTFactory.string([ASTFactory.interpolationString("a", "'a'")]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitSuperConstructorInvocation() {
+    SuperConstructorInvocation fromNode = ASTFactory.superConstructorInvocation([]);
+    ConstructorElement staticElement = ElementFactory.constructorElement(ElementFactory.classElement2("C", []), null);
+    fromNode.staticElement = staticElement;
+    SuperConstructorInvocation toNode = ASTFactory.superConstructorInvocation([]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+  }
+  void test_visitSuperExpression() {
+    SuperExpression fromNode = ASTFactory.superExpression();
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    SuperExpression toNode = ASTFactory.superExpression();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitSymbolLiteral() {
+    SymbolLiteral fromNode = ASTFactory.symbolLiteral(["s"]);
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    SymbolLiteral toNode = ASTFactory.symbolLiteral(["s"]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitThisExpression() {
+    ThisExpression fromNode = ASTFactory.thisExpression();
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    ThisExpression toNode = ASTFactory.thisExpression();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitThrowExpression() {
+    ThrowExpression fromNode = ASTFactory.throwExpression();
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    ThrowExpression toNode = ASTFactory.throwExpression();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitTypeName() {
+    TypeName fromNode = ASTFactory.typeName4("C", []);
+    Type2 type = ElementFactory.classElement2("C", []).type;
+    fromNode.type = type;
+    TypeName toNode = ASTFactory.typeName4("C", []);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(type, toNode.type);
+  }
+  static dartSuite() {
+    _ut.group('ResolutionCopierTest', () {
+      _ut.test('test_visitAnnotation', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitAnnotation);
+      });
+      _ut.test('test_visitArgumentDefinitionTest', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitArgumentDefinitionTest);
+      });
+      _ut.test('test_visitAsExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitAsExpression);
+      });
+      _ut.test('test_visitAssignmentExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitAssignmentExpression);
+      });
+      _ut.test('test_visitBinaryExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitBinaryExpression);
+      });
+      _ut.test('test_visitBooleanLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitBooleanLiteral);
+      });
+      _ut.test('test_visitCascadeExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitCascadeExpression);
+      });
+      _ut.test('test_visitCompilationUnit', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitCompilationUnit);
+      });
+      _ut.test('test_visitConditionalExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitConditionalExpression);
+      });
+      _ut.test('test_visitConstructorDeclaration', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitConstructorDeclaration);
+      });
+      _ut.test('test_visitConstructorName', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitConstructorName);
+      });
+      _ut.test('test_visitDoubleLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitDoubleLiteral);
+      });
+      _ut.test('test_visitExportDirective', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitExportDirective);
+      });
+      _ut.test('test_visitFunctionExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitFunctionExpression);
+      });
+      _ut.test('test_visitFunctionExpressionInvocation', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitFunctionExpressionInvocation);
+      });
+      _ut.test('test_visitImportDirective', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitImportDirective);
+      });
+      _ut.test('test_visitIndexExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitIndexExpression);
+      });
+      _ut.test('test_visitInstanceCreationExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitInstanceCreationExpression);
+      });
+      _ut.test('test_visitIntegerLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitIntegerLiteral);
+      });
+      _ut.test('test_visitIsExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitIsExpression);
+      });
+      _ut.test('test_visitLibraryIdentifier', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitLibraryIdentifier);
+      });
+      _ut.test('test_visitListLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitListLiteral);
+      });
+      _ut.test('test_visitMapLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitMapLiteral);
+      });
+      _ut.test('test_visitMethodInvocation', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitMethodInvocation);
+      });
+      _ut.test('test_visitNamedExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitNamedExpression);
+      });
+      _ut.test('test_visitNullLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitNullLiteral);
+      });
+      _ut.test('test_visitParenthesizedExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitParenthesizedExpression);
+      });
+      _ut.test('test_visitPartDirective', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitPartDirective);
+      });
+      _ut.test('test_visitPartOfDirective', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitPartOfDirective);
+      });
+      _ut.test('test_visitPostfixExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitPostfixExpression);
+      });
+      _ut.test('test_visitPrefixExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitPrefixExpression);
+      });
+      _ut.test('test_visitPrefixedIdentifier', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitPrefixedIdentifier);
+      });
+      _ut.test('test_visitPropertyAccess', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitPropertyAccess);
+      });
+      _ut.test('test_visitRedirectingConstructorInvocation', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitRedirectingConstructorInvocation);
+      });
+      _ut.test('test_visitRethrowExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitRethrowExpression);
+      });
+      _ut.test('test_visitSimpleIdentifier', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitSimpleIdentifier);
+      });
+      _ut.test('test_visitSimpleStringLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitSimpleStringLiteral);
+      });
+      _ut.test('test_visitStringInterpolation', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitStringInterpolation);
+      });
+      _ut.test('test_visitSuperConstructorInvocation', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitSuperConstructorInvocation);
+      });
+      _ut.test('test_visitSuperExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitSuperExpression);
+      });
+      _ut.test('test_visitSymbolLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitSymbolLiteral);
+      });
+      _ut.test('test_visitThisExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitThisExpression);
+      });
+      _ut.test('test_visitThrowExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitThrowExpression);
+      });
+      _ut.test('test_visitTypeName', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitTypeName);
+      });
+    });
+  }
+}
 /**
  * The class `RecoveryParserTest` defines parser tests that test the parsing of invalid code
  * sequences to ensure that the correct recovery steps are taken in the parser.
@@ -7594,6 +8301,123 @@
     });
   }
 }
+class IncrementalParserTest extends EngineTestCase {
+  void fail_reparse_oneFunctionToTwo() {
+    assertParse("f() {}", "f() => 0; g() {}");
+  }
+  void test_reparse_addedAfterIdentifier1() {
+    assertParse("f() => a + b;", "f() => abs + b;");
+  }
+  void test_reparse_addedAfterIdentifier2() {
+    assertParse("f() => a + b;", "f() => a + bar;");
+  }
+  void test_resparse_addedBeforeIdentifier1() {
+    assertParse("f() => a + b;", "f() => xa + b;");
+  }
+  void test_resparse_addedBeforeIdentifier2() {
+    assertParse("f() => a + b;", "f() => a + xb;");
+  }
+  void test_resparse_addedNewIdentifier1() {
+    assertParse("a; c;", "a; b c;");
+  }
+  void test_resparse_addedNewIdentifier2() {
+    assertParse("a;  c;", "a;b  c;");
+  }
+  void test_resparse_appendWhitespace1() {
+    assertParse("f() => a + b;", "f() => a + b; ");
+  }
+  void test_resparse_appendWhitespace2() {
+    assertParse("f() => a + b;", "f() => a + b;  ");
+  }
+  void test_resparse_insertedPeriod() {
+    assertParse("f() => a + b;", "f() => a + b.;");
+  }
+  void test_resparse_insertWhitespace() {
+    assertParse("f() => a + b;", "f() => a  + b;");
+  }
+  void assertParse(String originalContents, String modifiedContents) {
+    int originalLength = originalContents.length;
+    int modifiedLength = modifiedContents.length;
+    int replaceStart = 0;
+    while (replaceStart < originalLength && replaceStart < modifiedLength && originalContents.codeUnitAt(replaceStart) == modifiedContents.codeUnitAt(replaceStart)) {
+      replaceStart++;
+    }
+    int lengthDelta = modifiedLength - originalLength;
+    int originalEnd = originalLength - 1;
+    int modifiedEnd = modifiedLength - 1;
+    while (originalEnd >= replaceStart && modifiedEnd >= (replaceStart + lengthDelta) && originalContents.codeUnitAt(originalEnd) == modifiedContents.codeUnitAt(modifiedEnd)) {
+      originalEnd--;
+      modifiedEnd--;
+    }
+    Source source = new TestSource();
+    GatheringErrorListener originalListener = new GatheringErrorListener();
+    Scanner originalScanner = new Scanner(source, new CharSequenceReader(new CharSequence(originalContents)), originalListener);
+    Token originalToken = originalScanner.tokenize();
+    JUnitTestCase.assertNotNull(originalToken);
+    Parser originalParser = new Parser(source, originalListener);
+    CompilationUnit originalUnit = originalParser.parseCompilationUnit(originalToken);
+    JUnitTestCase.assertNotNull(originalUnit);
+    GatheringErrorListener modifiedListener = new GatheringErrorListener();
+    Scanner modifiedScanner = new Scanner(source, new CharSequenceReader(new CharSequence(modifiedContents)), modifiedListener);
+    Token modifiedToken = modifiedScanner.tokenize();
+    JUnitTestCase.assertNotNull(modifiedToken);
+    Parser modifiedParser = new Parser(source, modifiedListener);
+    CompilationUnit modifiedUnit = modifiedParser.parseCompilationUnit(modifiedToken);
+    JUnitTestCase.assertNotNull(modifiedUnit);
+    GatheringErrorListener incrementalListener = new GatheringErrorListener();
+    IncrementalScanner incrementalScanner = new IncrementalScanner(source, new CharSequenceReader(new CharSequence(modifiedContents)), incrementalListener);
+    Token incrementalToken = incrementalScanner.rescan(originalToken, replaceStart, originalEnd - replaceStart + 1, modifiedEnd - replaceStart + 1);
+    JUnitTestCase.assertNotNull(incrementalToken);
+    IncrementalParser incrementalParser = new IncrementalParser(source, incrementalScanner.tokenMap, incrementalListener);
+    CompilationUnit incrementalUnit = incrementalParser.reparse(originalUnit, incrementalScanner.firstToken, incrementalScanner.lastToken, replaceStart, originalEnd);
+    JUnitTestCase.assertNotNull(incrementalUnit);
+    JUnitTestCase.assertTrue(ASTComparator.equals3(modifiedUnit, incrementalUnit));
+  }
+  static dartSuite() {
+    _ut.group('IncrementalParserTest', () {
+      _ut.test('test_reparse_addedAfterIdentifier1', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_reparse_addedAfterIdentifier1);
+      });
+      _ut.test('test_reparse_addedAfterIdentifier2', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_reparse_addedAfterIdentifier2);
+      });
+      _ut.test('test_resparse_addedBeforeIdentifier1', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_resparse_addedBeforeIdentifier1);
+      });
+      _ut.test('test_resparse_addedBeforeIdentifier2', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_resparse_addedBeforeIdentifier2);
+      });
+      _ut.test('test_resparse_addedNewIdentifier1', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_resparse_addedNewIdentifier1);
+      });
+      _ut.test('test_resparse_addedNewIdentifier2', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_resparse_addedNewIdentifier2);
+      });
+      _ut.test('test_resparse_appendWhitespace1', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_resparse_appendWhitespace1);
+      });
+      _ut.test('test_resparse_appendWhitespace2', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_resparse_appendWhitespace2);
+      });
+      _ut.test('test_resparse_insertWhitespace', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_resparse_insertWhitespace);
+      });
+      _ut.test('test_resparse_insertedPeriod', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_resparse_insertedPeriod);
+      });
+    });
+  }
+}
 /**
  * The class `ErrorParserTest` defines parser tests that test the parsing of code to ensure
  * that errors are correctly reported, and in some cases, not reported.
@@ -9347,7 +10171,9 @@
 main() {
   ComplexParserTest.dartSuite();
   ErrorParserTest.dartSuite();
+  IncrementalParserTest.dartSuite();
   RecoveryParserTest.dartSuite();
+  ResolutionCopierTest.dartSuite();
   SimpleParserTest.dartSuite();
 }
 Map<String, MethodTrampoline> _methodTable_Parser = <String, MethodTrampoline> {
@@ -9355,6 +10181,36 @@
   'parseExpression_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseExpression(arg0)),
   'parseStatement_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseStatement(arg0)),
   'parseStatements_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseStatements(arg0)),
+  'parseAnnotation_0': new MethodTrampoline(0, (Parser target) => target.parseAnnotation()),
+  'parseArgument_0': new MethodTrampoline(0, (Parser target) => target.parseArgument()),
+  'parseArgumentList_0': new MethodTrampoline(0, (Parser target) => target.parseArgumentList()),
+  'parseBitwiseOrExpression_0': new MethodTrampoline(0, (Parser target) => target.parseBitwiseOrExpression()),
+  'parseBlock_0': new MethodTrampoline(0, (Parser target) => target.parseBlock()),
+  'parseClassMember_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseClassMember(arg0)),
+  'parseCompilationUnit_0': new MethodTrampoline(0, (Parser target) => target.parseCompilationUnit2()),
+  'parseConditionalExpression_0': new MethodTrampoline(0, (Parser target) => target.parseConditionalExpression()),
+  'parseConstructorName_0': new MethodTrampoline(0, (Parser target) => target.parseConstructorName()),
+  'parseExpression_0': new MethodTrampoline(0, (Parser target) => target.parseExpression2()),
+  'parseExpressionWithoutCascade_0': new MethodTrampoline(0, (Parser target) => target.parseExpressionWithoutCascade()),
+  'parseExtendsClause_0': new MethodTrampoline(0, (Parser target) => target.parseExtendsClause()),
+  'parseFormalParameterList_0': new MethodTrampoline(0, (Parser target) => target.parseFormalParameterList()),
+  'parseFunctionExpression_0': new MethodTrampoline(0, (Parser target) => target.parseFunctionExpression()),
+  'parseImplementsClause_0': new MethodTrampoline(0, (Parser target) => target.parseImplementsClause()),
+  'parseLabel_0': new MethodTrampoline(0, (Parser target) => target.parseLabel()),
+  'parseLibraryIdentifier_0': new MethodTrampoline(0, (Parser target) => target.parseLibraryIdentifier()),
+  'parseLogicalOrExpression_0': new MethodTrampoline(0, (Parser target) => target.parseLogicalOrExpression()),
+  'parseMapLiteralEntry_0': new MethodTrampoline(0, (Parser target) => target.parseMapLiteralEntry()),
+  'parseNormalFormalParameter_0': new MethodTrampoline(0, (Parser target) => target.parseNormalFormalParameter()),
+  'parsePrefixedIdentifier_0': new MethodTrampoline(0, (Parser target) => target.parsePrefixedIdentifier()),
+  'parseReturnType_0': new MethodTrampoline(0, (Parser target) => target.parseReturnType()),
+  'parseSimpleIdentifier_0': new MethodTrampoline(0, (Parser target) => target.parseSimpleIdentifier()),
+  'parseStatement_0': new MethodTrampoline(0, (Parser target) => target.parseStatement2()),
+  'parseStringLiteral_0': new MethodTrampoline(0, (Parser target) => target.parseStringLiteral()),
+  'parseTypeArgumentList_0': new MethodTrampoline(0, (Parser target) => target.parseTypeArgumentList()),
+  'parseTypeName_0': new MethodTrampoline(0, (Parser target) => target.parseTypeName()),
+  'parseTypeParameter_0': new MethodTrampoline(0, (Parser target) => target.parseTypeParameter()),
+  'parseTypeParameterList_0': new MethodTrampoline(0, (Parser target) => target.parseTypeParameterList()),
+  'parseWithClause_0': new MethodTrampoline(0, (Parser target) => target.parseWithClause()),
   'advance_0': new MethodTrampoline(0, (Parser target) => target.advance()),
   'appendScalarValue_5': new MethodTrampoline(5, (Parser target, arg0, arg1, arg2, arg3, arg4) => target.appendScalarValue(arg0, arg1, arg2, arg3, arg4)),
   'computeStringValue_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.computeStringValue(arg0, arg1, arg2)),
@@ -9386,34 +10242,25 @@
   'matchesIdentifier_1': new MethodTrampoline(1, (Parser target, arg0) => target.matchesIdentifier2(arg0)),
   'optional_1': new MethodTrampoline(1, (Parser target, arg0) => target.optional(arg0)),
   'parseAdditiveExpression_0': new MethodTrampoline(0, (Parser target) => target.parseAdditiveExpression()),
-  'parseAnnotation_0': new MethodTrampoline(0, (Parser target) => target.parseAnnotation()),
-  'parseArgument_0': new MethodTrampoline(0, (Parser target) => target.parseArgument()),
   'parseArgumentDefinitionTest_0': new MethodTrampoline(0, (Parser target) => target.parseArgumentDefinitionTest()),
-  'parseArgumentList_0': new MethodTrampoline(0, (Parser target) => target.parseArgumentList()),
   'parseAssertStatement_0': new MethodTrampoline(0, (Parser target) => target.parseAssertStatement()),
   'parseAssignableExpression_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseAssignableExpression(arg0)),
   'parseAssignableSelector_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseAssignableSelector(arg0, arg1)),
   'parseBitwiseAndExpression_0': new MethodTrampoline(0, (Parser target) => target.parseBitwiseAndExpression()),
-  'parseBitwiseOrExpression_0': new MethodTrampoline(0, (Parser target) => target.parseBitwiseOrExpression()),
   'parseBitwiseXorExpression_0': new MethodTrampoline(0, (Parser target) => target.parseBitwiseXorExpression()),
-  'parseBlock_0': new MethodTrampoline(0, (Parser target) => target.parseBlock()),
   'parseBreakStatement_0': new MethodTrampoline(0, (Parser target) => target.parseBreakStatement()),
   'parseCascadeSection_0': new MethodTrampoline(0, (Parser target) => target.parseCascadeSection()),
   'parseClassDeclaration_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseClassDeclaration(arg0, arg1)),
-  'parseClassMember_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseClassMember(arg0)),
   'parseClassMembers_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseClassMembers(arg0, arg1)),
   'parseClassTypeAlias_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseClassTypeAlias(arg0, arg1)),
   'parseCombinators_0': new MethodTrampoline(0, (Parser target) => target.parseCombinators()),
   'parseCommentAndMetadata_0': new MethodTrampoline(0, (Parser target) => target.parseCommentAndMetadata()),
   'parseCommentReference_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseCommentReference(arg0, arg1)),
   'parseCommentReferences_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseCommentReferences(arg0)),
-  'parseCompilationUnit_0': new MethodTrampoline(0, (Parser target) => target.parseCompilationUnit2()),
   'parseCompilationUnitMember_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseCompilationUnitMember(arg0)),
-  'parseConditionalExpression_0': new MethodTrampoline(0, (Parser target) => target.parseConditionalExpression()),
   'parseConstExpression_0': new MethodTrampoline(0, (Parser target) => target.parseConstExpression()),
   'parseConstructor_8': new MethodTrampoline(8, (Parser target, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) => target.parseConstructor(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7)),
   'parseConstructorFieldInitializer_0': new MethodTrampoline(0, (Parser target) => target.parseConstructorFieldInitializer()),
-  'parseConstructorName_0': new MethodTrampoline(0, (Parser target) => target.parseConstructorName()),
   'parseContinueStatement_0': new MethodTrampoline(0, (Parser target) => target.parseContinueStatement()),
   'parseDirective_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseDirective(arg0)),
   'parseDocumentationComment_0': new MethodTrampoline(0, (Parser target) => target.parseDocumentationComment()),
@@ -9421,36 +10268,27 @@
   'parseEmptyStatement_0': new MethodTrampoline(0, (Parser target) => target.parseEmptyStatement()),
   'parseEqualityExpression_0': new MethodTrampoline(0, (Parser target) => target.parseEqualityExpression()),
   'parseExportDirective_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseExportDirective(arg0)),
-  'parseExpression_0': new MethodTrampoline(0, (Parser target) => target.parseExpression2()),
   'parseExpressionList_0': new MethodTrampoline(0, (Parser target) => target.parseExpressionList()),
-  'parseExpressionWithoutCascade_0': new MethodTrampoline(0, (Parser target) => target.parseExpressionWithoutCascade()),
-  'parseExtendsClause_0': new MethodTrampoline(0, (Parser target) => target.parseExtendsClause()),
   'parseFinalConstVarOrType_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseFinalConstVarOrType(arg0)),
   'parseFormalParameter_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseFormalParameter(arg0)),
-  'parseFormalParameterList_0': new MethodTrampoline(0, (Parser target) => target.parseFormalParameterList()),
   'parseForStatement_0': new MethodTrampoline(0, (Parser target) => target.parseForStatement()),
   'parseFunctionBody_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.parseFunctionBody(arg0, arg1, arg2)),
   'parseFunctionDeclaration_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.parseFunctionDeclaration(arg0, arg1, arg2)),
   'parseFunctionDeclarationStatement_0': new MethodTrampoline(0, (Parser target) => target.parseFunctionDeclarationStatement()),
   'parseFunctionDeclarationStatement_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseFunctionDeclarationStatement2(arg0, arg1)),
-  'parseFunctionExpression_0': new MethodTrampoline(0, (Parser target) => target.parseFunctionExpression()),
   'parseFunctionTypeAlias_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseFunctionTypeAlias(arg0, arg1)),
   'parseGetter_4': new MethodTrampoline(4, (Parser target, arg0, arg1, arg2, arg3) => target.parseGetter(arg0, arg1, arg2, arg3)),
   'parseIdentifierList_0': new MethodTrampoline(0, (Parser target) => target.parseIdentifierList()),
   'parseIfStatement_0': new MethodTrampoline(0, (Parser target) => target.parseIfStatement()),
-  'parseImplementsClause_0': new MethodTrampoline(0, (Parser target) => target.parseImplementsClause()),
   'parseImportDirective_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseImportDirective(arg0)),
   'parseInitializedIdentifierList_4': new MethodTrampoline(4, (Parser target, arg0, arg1, arg2, arg3) => target.parseInitializedIdentifierList(arg0, arg1, arg2, arg3)),
   'parseInstanceCreationExpression_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseInstanceCreationExpression(arg0)),
   'parseLibraryDirective_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseLibraryDirective(arg0)),
-  'parseLibraryIdentifier_0': new MethodTrampoline(0, (Parser target) => target.parseLibraryIdentifier()),
   'parseLibraryName_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseLibraryName(arg0, arg1)),
   'parseListLiteral_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseListLiteral(arg0, arg1)),
   'parseListOrMapLiteral_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseListOrMapLiteral(arg0)),
   'parseLogicalAndExpression_0': new MethodTrampoline(0, (Parser target) => target.parseLogicalAndExpression()),
-  'parseLogicalOrExpression_0': new MethodTrampoline(0, (Parser target) => target.parseLogicalOrExpression()),
   'parseMapLiteral_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseMapLiteral(arg0, arg1)),
-  'parseMapLiteralEntry_0': new MethodTrampoline(0, (Parser target) => target.parseMapLiteralEntry()),
   'parseMethodDeclaration_4': new MethodTrampoline(4, (Parser target, arg0, arg1, arg2, arg3) => target.parseMethodDeclaration(arg0, arg1, arg2, arg3)),
   'parseMethodDeclaration_6': new MethodTrampoline(6, (Parser target, arg0, arg1, arg2, arg3, arg4, arg5) => target.parseMethodDeclaration2(arg0, arg1, arg2, arg3, arg4, arg5)),
   'parseModifiers_0': new MethodTrampoline(0, (Parser target) => target.parseModifiers()),
@@ -9458,25 +10296,19 @@
   'parseNativeClause_0': new MethodTrampoline(0, (Parser target) => target.parseNativeClause()),
   'parseNewExpression_0': new MethodTrampoline(0, (Parser target) => target.parseNewExpression()),
   'parseNonLabeledStatement_0': new MethodTrampoline(0, (Parser target) => target.parseNonLabeledStatement()),
-  'parseNormalFormalParameter_0': new MethodTrampoline(0, (Parser target) => target.parseNormalFormalParameter()),
   'parseOperator_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.parseOperator(arg0, arg1, arg2)),
   'parseOptionalReturnType_0': new MethodTrampoline(0, (Parser target) => target.parseOptionalReturnType()),
   'parsePartDirective_1': new MethodTrampoline(1, (Parser target, arg0) => target.parsePartDirective(arg0)),
   'parsePostfixExpression_0': new MethodTrampoline(0, (Parser target) => target.parsePostfixExpression()),
-  'parsePrefixedIdentifier_0': new MethodTrampoline(0, (Parser target) => target.parsePrefixedIdentifier()),
   'parsePrimaryExpression_0': new MethodTrampoline(0, (Parser target) => target.parsePrimaryExpression()),
   'parseRedirectingConstructorInvocation_0': new MethodTrampoline(0, (Parser target) => target.parseRedirectingConstructorInvocation()),
   'parseRelationalExpression_0': new MethodTrampoline(0, (Parser target) => target.parseRelationalExpression()),
   'parseRethrowExpression_0': new MethodTrampoline(0, (Parser target) => target.parseRethrowExpression()),
   'parseReturnStatement_0': new MethodTrampoline(0, (Parser target) => target.parseReturnStatement()),
-  'parseReturnType_0': new MethodTrampoline(0, (Parser target) => target.parseReturnType()),
   'parseSetter_4': new MethodTrampoline(4, (Parser target, arg0, arg1, arg2, arg3) => target.parseSetter(arg0, arg1, arg2, arg3)),
   'parseShiftExpression_0': new MethodTrampoline(0, (Parser target) => target.parseShiftExpression()),
-  'parseSimpleIdentifier_0': new MethodTrampoline(0, (Parser target) => target.parseSimpleIdentifier()),
-  'parseStatement_0': new MethodTrampoline(0, (Parser target) => target.parseStatement2()),
   'parseStatements_0': new MethodTrampoline(0, (Parser target) => target.parseStatements2()),
   'parseStringInterpolation_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseStringInterpolation(arg0)),
-  'parseStringLiteral_0': new MethodTrampoline(0, (Parser target) => target.parseStringLiteral()),
   'parseSuperConstructorInvocation_0': new MethodTrampoline(0, (Parser target) => target.parseSuperConstructorInvocation()),
   'parseSwitchStatement_0': new MethodTrampoline(0, (Parser target) => target.parseSwitchStatement()),
   'parseSymbolLiteral_0': new MethodTrampoline(0, (Parser target) => target.parseSymbolLiteral()),
@@ -9484,10 +10316,6 @@
   'parseThrowExpressionWithoutCascade_0': new MethodTrampoline(0, (Parser target) => target.parseThrowExpressionWithoutCascade()),
   'parseTryStatement_0': new MethodTrampoline(0, (Parser target) => target.parseTryStatement()),
   'parseTypeAlias_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseTypeAlias(arg0)),
-  'parseTypeArgumentList_0': new MethodTrampoline(0, (Parser target) => target.parseTypeArgumentList()),
-  'parseTypeName_0': new MethodTrampoline(0, (Parser target) => target.parseTypeName()),
-  'parseTypeParameter_0': new MethodTrampoline(0, (Parser target) => target.parseTypeParameter()),
-  'parseTypeParameterList_0': new MethodTrampoline(0, (Parser target) => target.parseTypeParameterList()),
   'parseUnaryExpression_0': new MethodTrampoline(0, (Parser target) => target.parseUnaryExpression()),
   'parseVariableDeclaration_0': new MethodTrampoline(0, (Parser target) => target.parseVariableDeclaration()),
   'parseVariableDeclarationList_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseVariableDeclarationList(arg0)),
@@ -9495,7 +10323,6 @@
   'parseVariableDeclarationStatement_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseVariableDeclarationStatement(arg0)),
   'parseVariableDeclarationStatement_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.parseVariableDeclarationStatement2(arg0, arg1, arg2)),
   'parseWhileStatement_0': new MethodTrampoline(0, (Parser target) => target.parseWhileStatement()),
-  'parseWithClause_0': new MethodTrampoline(0, (Parser target) => target.parseWithClause()),
   'peek_0': new MethodTrampoline(0, (Parser target) => target.peek()),
   'peek_1': new MethodTrampoline(1, (Parser target, arg0) => target.peek2(arg0)),
   'reportError_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.reportError(arg0, arg1, arg2)),
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 07b7193..ef46283 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -19,27 +19,6 @@
 import 'ast_test.dart' show ASTFactory;
 import 'element_test.dart' show ElementFactory;
 class TypePropagationTest extends ResolverTestCase {
-  void fail_functionExpression_asInvocationArgument_functionExpressionInvocation() {
-    String code = EngineTestCase.createSource([
-        "main() {",
-        "  (f(String value)) {} ((v) {",
-        "    v;",
-        "  });",
-        "}"]);
-    Source source = addSource(code);
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    Type2 dynamicType = typeProvider.dynamicType;
-    Type2 stringType = typeProvider.stringType;
-    FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", FormalParameter);
-    JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
-    JUnitTestCase.assertSame(dynamicType, vParameter.identifier.staticType);
-    SimpleIdentifier vIdentifier = EngineTestCase.findNode(unit, code, "v;", SimpleIdentifier);
-    JUnitTestCase.assertSame(stringType, vIdentifier.propagatedType);
-    JUnitTestCase.assertSame(dynamicType, vIdentifier.staticType);
-  }
   void fail_propagatedReturnType_functionExpression() {
     String code = EngineTestCase.createSource(["main() {", "  var v = (() {return 42;})();", "}"]);
     check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
@@ -184,6 +163,27 @@
     FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", SimpleFormalParameter);
     JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
   }
+  void test_functionExpression_asInvocationArgument_functionExpressionInvocation() {
+    String code = EngineTestCase.createSource([
+        "main() {",
+        "  (f(String value)) {} ((v) {",
+        "    v;",
+        "  });",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    Type2 dynamicType = typeProvider.dynamicType;
+    Type2 stringType = typeProvider.stringType;
+    FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", FormalParameter);
+    JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
+    JUnitTestCase.assertSame(dynamicType, vParameter.identifier.staticType);
+    SimpleIdentifier vIdentifier = EngineTestCase.findNode(unit, code, "v;", SimpleIdentifier);
+    JUnitTestCase.assertSame(stringType, vIdentifier.propagatedType);
+    JUnitTestCase.assertSame(dynamicType, vIdentifier.staticType);
+  }
   void test_functionExpression_asInvocationArgument_keepIfLessSpecific() {
     String code = EngineTestCase.createSource([
         "class MyList {",
@@ -759,6 +759,10 @@
         final __test = new TypePropagationTest();
         runJUnitTest(__test, __test.test_functionExpression_asInvocationArgument_fromInferredInvocation);
       });
+      _ut.test('test_functionExpression_asInvocationArgument_functionExpressionInvocation', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_functionExpression_asInvocationArgument_functionExpressionInvocation);
+      });
       _ut.test('test_functionExpression_asInvocationArgument_keepIfLessSpecific', () {
         final __test = new TypePropagationTest();
         runJUnitTest(__test, __test.test_functionExpression_asInvocationArgument_keepIfLessSpecific);
@@ -2936,6 +2940,7 @@
   void test_proxy_annotation_prefixed() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
+        "import 'meta.dart';",
         "@proxy",
         "class A {}",
         "f(A a) {",
@@ -2946,12 +2951,17 @@
         "  a++;",
         "  ++a;",
         "}"]));
+    addSource2("/meta.dart", EngineTestCase.createSource([
+        "library meta;",
+        "const proxy = const _Proxy();",
+        "class _Proxy { const _Proxy(); }"]));
     resolve(source);
     assertNoErrors(source);
   }
   void test_proxy_annotation_prefixed2() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
+        "import 'meta.dart';",
         "@proxy",
         "class A {}",
         "class B {",
@@ -2964,12 +2974,17 @@
         "    ++a;",
         "  }",
         "}"]));
+    addSource2("/meta.dart", EngineTestCase.createSource([
+        "library meta;",
+        "const proxy = const _Proxy();",
+        "class _Proxy { const _Proxy(); }"]));
     resolve(source);
     assertNoErrors(source);
   }
   void test_proxy_annotation_prefixed3() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
+        "import 'meta.dart';",
         "class B {",
         "  f(A a) {",
         "    a.m();",
@@ -2982,12 +2997,17 @@
         "}",
         "@proxy",
         "class A {}"]));
+    addSource2("/meta.dart", EngineTestCase.createSource([
+        "library meta;",
+        "const proxy = const _Proxy();",
+        "class _Proxy { const _Proxy(); }"]));
     resolve(source);
     assertNoErrors(source);
   }
   void test_proxy_annotation_simple() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
+        "import 'meta.dart';",
         "@proxy",
         "class B {",
         "  m() {",
@@ -2997,6 +3017,10 @@
         "    var y = this + this;",
         "  }",
         "}"]));
+    addSource2("/meta.dart", EngineTestCase.createSource([
+        "library meta;",
+        "const proxy = const _Proxy();",
+        "class _Proxy { const _Proxy(); }"]));
     resolve(source);
     assertNoErrors(source);
   }
@@ -3186,6 +3210,18 @@
     assertNoErrors(source);
     verify([source]);
   }
+  void test_reversedTypeArguments() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class Codec<S1, T1> {",
+        "  Codec<T1, S1> get inverted => new _InvertedCodec<T1, S1>(this);",
+        "}",
+        "class _InvertedCodec<T2, S2> extends Codec<T2, S2> {",
+        "  _InvertedCodec(Codec<S2, T2> codec);",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
   void test_staticAccessToInstanceMember_annotation() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3393,6 +3429,24 @@
     assertNoErrors(source);
     verify([source]);
   }
+  void test_typePromotion_if_extends_moreSpecific() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class V {}",
+        "class VP extends V {}",
+        "class A<T> {}",
+        "class B<S> extends A<S> {",
+        "  var b;",
+        "}",
+        "",
+        "main(A<V> p) {",
+        "  if (p is B<VP>) {",
+        "    p.b;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
   void test_typePromotion_if_hasAssignment_outsideAfter() {
     Source source = addSource(EngineTestCase.createSource([
         "main(Object p) {",
@@ -3417,6 +3471,38 @@
     assertNoErrors(source);
     verify([source]);
   }
+  void test_typePromotion_if_implements_moreSpecific() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class V {}",
+        "class VP extends V {}",
+        "class A<T> {}",
+        "class B<S> implements A<S> {",
+        "  var b;",
+        "}",
+        "",
+        "main(A<V> p) {",
+        "  if (p is B<VP>) {",
+        "    p.b;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+  void test_typePromotion_if_inClosure_assignedAfter_inSameFunction() {
+    Source source = addSource(EngineTestCase.createSource([
+        "main() {",
+        "  f(Object p) {",
+        "    if (p is String) {",
+        "      p.length;",
+        "    }",
+        "    p = 0;",
+        "  };",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
   void test_typePromotion_if_is_and_left() {
     Source source = addSource(EngineTestCase.createSource([
         "bool tt() => true;",
@@ -3481,6 +3567,47 @@
     assertNoErrors(source);
     verify([source]);
   }
+  void test_typeType_class() {
+    Source source = addSource(EngineTestCase.createSource(["class C {}", "f(Type t) {}", "main() {", "  f(C);", "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+  void test_typeType_class_prefixed() {
+    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class C {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "import 'lib.dart' as p;",
+        "f(Type t) {}",
+        "main() {",
+        "  f(p.C);",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+  void test_typeType_functionTypeAlias() {
+    Source source = addSource(EngineTestCase.createSource([
+        "typedef F();",
+        "f(Type t) {}",
+        "main() {",
+        "  f(F);",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+  void test_typeType_functionTypeAlias_prefixed() {
+    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "typedef F();"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "import 'lib.dart' as p;",
+        "f(Type t) {}",
+        "main() {",
+        "  f(p.F);",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
   void test_undefinedConstructorInInitializer_explicit_named() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3646,6 +3773,19 @@
     assertNoErrors(source);
     verify([source]);
   }
+  void test_unqualifiedReferenceToNonLocalStaticMember_fromComment_new() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  A() {}",
+        "  A.named() {}",
+        "}",
+        "/// [new A] or [new A.named]",
+        "main() {",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
   void test_wrongNumberOfParametersForOperator_index() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  operator []=(a, b) {}", "}"]));
     resolve(source);
@@ -4591,6 +4731,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_returnWithoutValue_void);
       });
+      _ut.test('test_reversedTypeArguments', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_reversedTypeArguments);
+      });
       _ut.test('test_staticAccessToInstanceMember_annotation', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_staticAccessToInstanceMember_annotation);
@@ -4667,6 +4811,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_typePromotion_if_accessedInClosure_noAssignment);
       });
+      _ut.test('test_typePromotion_if_extends_moreSpecific', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_typePromotion_if_extends_moreSpecific);
+      });
       _ut.test('test_typePromotion_if_hasAssignment_outsideAfter', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_typePromotion_if_hasAssignment_outsideAfter);
@@ -4675,6 +4823,14 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_typePromotion_if_hasAssignment_outsideBefore);
       });
+      _ut.test('test_typePromotion_if_implements_moreSpecific', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_typePromotion_if_implements_moreSpecific);
+      });
+      _ut.test('test_typePromotion_if_inClosure_assignedAfter_inSameFunction', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_typePromotion_if_inClosure_assignedAfter_inSameFunction);
+      });
       _ut.test('test_typePromotion_if_is_and_left', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_typePromotion_if_is_and_left);
@@ -4695,6 +4851,22 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_typePromotion_if_is_single);
       });
+      _ut.test('test_typeType_class', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_typeType_class);
+      });
+      _ut.test('test_typeType_class_prefixed', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_typeType_class_prefixed);
+      });
+      _ut.test('test_typeType_functionTypeAlias', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_typeType_functionTypeAlias);
+      });
+      _ut.test('test_typeType_functionTypeAlias_prefixed', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_typeType_functionTypeAlias_prefixed);
+      });
       _ut.test('test_undefinedConstructorInInitializer_explicit_named', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_undefinedConstructorInInitializer_explicit_named);
@@ -4759,6 +4931,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_undefinedSuperMethod_method);
       });
+      _ut.test('test_unqualifiedReferenceToNonLocalStaticMember_fromComment_new', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_unqualifiedReferenceToNonLocalStaticMember_fromComment_new);
+      });
       _ut.test('test_wrongNumberOfParametersForOperator1', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_wrongNumberOfParametersForOperator1);
@@ -5550,6 +5726,38 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+  void test_typePromotion_if_extends_notMoreSpecific_dynamic() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class V {}",
+        "class A<T> {}",
+        "class B<S> extends A<S> {",
+        "  var b;",
+        "}",
+        "",
+        "main(A<V> p) {",
+        "  if (p is B) {",
+        "    p.b;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+  void test_typePromotion_if_extends_notMoreSpecific_notMoreSpecificTypeArg() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class V {}",
+        "class A<T> {}",
+        "class B<S> extends A<S> {",
+        "  var b;",
+        "}",
+        "",
+        "main(A<V> p) {",
+        "  if (p is B<int>) {",
+        "    p.b;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
   void test_typePromotion_if_hasAssignment_after() {
     Source source = addSource(EngineTestCase.createSource([
         "main(Object p) {",
@@ -5572,6 +5780,82 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+  void test_typePromotion_if_hasAssignment_inClosure_anonymous_after() {
+    Source source = addSource(EngineTestCase.createSource([
+        "main(Object p) {",
+        "  if (p is String) {",
+        "    p.length;",
+        "  }",
+        "  () {p = 0;};",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+  void test_typePromotion_if_hasAssignment_inClosure_anonymous_before() {
+    Source source = addSource(EngineTestCase.createSource([
+        "main(Object p) {",
+        "  () {p = 0;};",
+        "  if (p is String) {",
+        "    p.length;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+  void test_typePromotion_if_hasAssignment_inClosure_function_after() {
+    Source source = addSource(EngineTestCase.createSource([
+        "main(Object p) {",
+        "  if (p is String) {",
+        "    p.length;",
+        "  }",
+        "  f() {p = 0;};",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+  void test_typePromotion_if_hasAssignment_inClosure_function_before() {
+    Source source = addSource(EngineTestCase.createSource([
+        "main(Object p) {",
+        "  f() {p = 0;};",
+        "  if (p is String) {",
+        "    p.length;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+  void test_typePromotion_if_implements_notMoreSpecific_dynamic() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class V {}",
+        "class A<T> {}",
+        "class B<S> implements A<S> {",
+        "  var b;",
+        "}",
+        "",
+        "main(A<V> p) {",
+        "  if (p is B) {",
+        "    p.b;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+  void test_typePromotion_if_with_notMoreSpecific_dynamic() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class V {}",
+        "class A<T> {}",
+        "class B<S> extends Object with A<S> {",
+        "  var b;",
+        "}",
+        "",
+        "main(A<V> p) {",
+        "  if (p is B) {",
+        "    p.b;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
   void test_undefinedGetter() {
     Source source = addSource(EngineTestCase.createSource(["class T {}", "f(T e) { return e.m; }"]));
     resolve(source);
@@ -6033,6 +6317,14 @@
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_typePromotion_if_and_right_hasAssignment);
       });
+      _ut.test('test_typePromotion_if_extends_notMoreSpecific_dynamic', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_typePromotion_if_extends_notMoreSpecific_dynamic);
+      });
+      _ut.test('test_typePromotion_if_extends_notMoreSpecific_notMoreSpecificTypeArg', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_typePromotion_if_extends_notMoreSpecific_notMoreSpecificTypeArg);
+      });
       _ut.test('test_typePromotion_if_hasAssignment_after', () {
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_typePromotion_if_hasAssignment_after);
@@ -6041,6 +6333,30 @@
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_typePromotion_if_hasAssignment_before);
       });
+      _ut.test('test_typePromotion_if_hasAssignment_inClosure_anonymous_after', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_typePromotion_if_hasAssignment_inClosure_anonymous_after);
+      });
+      _ut.test('test_typePromotion_if_hasAssignment_inClosure_anonymous_before', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_typePromotion_if_hasAssignment_inClosure_anonymous_before);
+      });
+      _ut.test('test_typePromotion_if_hasAssignment_inClosure_function_after', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_typePromotion_if_hasAssignment_inClosure_function_after);
+      });
+      _ut.test('test_typePromotion_if_hasAssignment_inClosure_function_before', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_typePromotion_if_hasAssignment_inClosure_function_before);
+      });
+      _ut.test('test_typePromotion_if_implements_notMoreSpecific_dynamic', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_typePromotion_if_implements_notMoreSpecific_dynamic);
+      });
+      _ut.test('test_typePromotion_if_with_notMoreSpecific_dynamic', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_typePromotion_if_with_notMoreSpecific_dynamic);
+      });
       _ut.test('test_undefinedGetter', () {
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedGetter);
@@ -9631,6 +9947,25 @@
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
     verify([source]);
   }
+  void test_invalidAnnotation_unresolved_identifier() {
+    Source source = addSource(EngineTestCase.createSource(["@unresolved", "main() {", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+  }
+  void test_invalidAnnotation_unresolved_invocation() {
+    Source source = addSource(EngineTestCase.createSource(["@Unresolved()", "main() {", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+  }
+  void test_invalidAnnotation_unresolved_prefixedIdentifier() {
+    Source source = addSource(EngineTestCase.createSource([
+        "import 'dart:math' as p;",
+        "@p.unresolved",
+        "main() {",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+  }
   void test_invalidConstructorName_notEnclosingClassName_defined() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  B() : super();", "}", "class B {}"]));
     resolve(source);
@@ -10578,30 +10913,6 @@
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
   }
-  void test_referenceToDeclaredVariableInInitializer_closure() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  var x = (x) {};", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER]);
-    verify([source]);
-  }
-  void test_referenceToDeclaredVariableInInitializer_getter() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  int x = x + 1;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER]);
-    verify([source]);
-  }
-  void test_referenceToDeclaredVariableInInitializer_setter() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  int x = x++;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER]);
-    verify([source]);
-  }
-  void test_referenceToDeclaredVariableInInitializer_unqualifiedInvocation() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  var x = x();", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER]);
-    verify([source]);
-  }
   void test_rethrowOutsideCatch() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  rethrow;", "}"]));
     resolve(source);
@@ -11654,6 +11965,18 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_invalidAnnotation_staticMethodReference);
       });
+      _ut.test('test_invalidAnnotation_unresolved_identifier', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidAnnotation_unresolved_identifier);
+      });
+      _ut.test('test_invalidAnnotation_unresolved_invocation', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidAnnotation_unresolved_invocation);
+      });
+      _ut.test('test_invalidAnnotation_unresolved_prefixedIdentifier', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidAnnotation_unresolved_prefixedIdentifier);
+      });
       _ut.test('test_invalidConstructorName_notEnclosingClassName_defined', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_invalidConstructorName_notEnclosingClassName_defined);
@@ -12098,22 +12421,6 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_redirectToNonConstConstructor);
       });
-      _ut.test('test_referenceToDeclaredVariableInInitializer_closure', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_referenceToDeclaredVariableInInitializer_closure);
-      });
-      _ut.test('test_referenceToDeclaredVariableInInitializer_getter', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_referenceToDeclaredVariableInInitializer_getter);
-      });
-      _ut.test('test_referenceToDeclaredVariableInInitializer_setter', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_referenceToDeclaredVariableInInitializer_setter);
-      });
-      _ut.test('test_referenceToDeclaredVariableInInitializer_unqualifiedInvocation', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_referenceToDeclaredVariableInInitializer_unqualifiedInvocation);
-      });
       _ut.test('test_referencedBeforeDeclaration_hideInBlock_function', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_referencedBeforeDeclaration_hideInBlock_function);
@@ -13815,6 +14122,24 @@
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+  void test_argumentTypeNotAssignable_cascadeSEcond() {
+    Source source = addSource(EngineTestCase.createSource([
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "class A {",
+        "  B ma() {}",
+        "}",
+        "class B {",
+        "  mb(String p) {}",
+        "}",
+        "",
+        "main() {",
+        "  A a = new A();",
+        "  a..  ma().mb(0);",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
   void test_argumentTypeNotAssignable_const() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -13839,6 +14164,12 @@
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+  void test_argumentTypeNotAssignable_functionExpressionInvocation_required() {
+    Source source = addSource(EngineTestCase.createSource(["main() {", "  (int x) {} ('');", "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
   void test_argumentTypeNotAssignable_index() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14294,6 +14625,12 @@
     assertErrors(source, [StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS]);
     verify([source]);
   }
+  void test_extraPositionalArguments_functionExpression() {
+    Source source = addSource(EngineTestCase.createSource(["main() {", "  (int x) {} (0, 1);", "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS]);
+    verify([source]);
+  }
   void test_fieldInitializedInInitializerAndDeclaration_final() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -15153,6 +15490,12 @@
     assertErrors(source, [StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
     verify([source]);
   }
+  void test_notEnoughRequiredArguments_functionExpression() {
+    Source source = addSource(EngineTestCase.createSource(["main() {", "  (int x) {} ();", "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
+    verify([source]);
+  }
   void test_partOfDifferentLibrary() {
     Source source = addSource(EngineTestCase.createSource(["library lib;", "part 'part.dart';"]));
     addSource2("/part.dart", EngineTestCase.createSource(["part of lub;"]));
@@ -15388,11 +15731,6 @@
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
-  void test_undefinedIdentifier_metadata() {
-    Source source = addSource(EngineTestCase.createSource(["@undefined class A {}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
-  }
   void test_undefinedIdentifier_methodInvocation() {
     Source source = addSource(EngineTestCase.createSource(["f() { C.m(); }"]));
     resolve(source);
@@ -15500,6 +15838,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_argumentTypeNotAssignable_binary);
       });
+      _ut.test('test_argumentTypeNotAssignable_cascadeSEcond', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_cascadeSEcond);
+      });
       _ut.test('test_argumentTypeNotAssignable_const', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_argumentTypeNotAssignable_const);
@@ -15508,6 +15850,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_argumentTypeNotAssignable_const_super);
       });
+      _ut.test('test_argumentTypeNotAssignable_functionExpressionInvocation_required', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_functionExpressionInvocation_required);
+      });
       _ut.test('test_argumentTypeNotAssignable_index', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_argumentTypeNotAssignable_index);
@@ -15696,6 +16042,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_extraPositionalArguments);
       });
+      _ut.test('test_extraPositionalArguments_functionExpression', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_extraPositionalArguments_functionExpression);
+      });
       _ut.test('test_fieldInitializedInInitializerAndDeclaration_final', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_fieldInitializedInInitializerAndDeclaration_final);
@@ -16016,6 +16366,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_notEnoughRequiredArguments);
       });
+      _ut.test('test_notEnoughRequiredArguments_functionExpression', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_notEnoughRequiredArguments_functionExpression);
+      });
       _ut.test('test_partOfDifferentLibrary', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_partOfDifferentLibrary);
@@ -16140,10 +16494,6 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedIdentifier_initializer_prefix);
       });
-      _ut.test('test_undefinedIdentifier_metadata', () {
-        final __test = new StaticWarningCodeTest();
-        runJUnitTest(__test, __test.test_undefinedIdentifier_metadata);
-      });
       _ut.test('test_undefinedIdentifier_methodInvocation', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedIdentifier_methodInvocation);
@@ -16692,12 +17042,6 @@
     Scope scope = new LibraryImportScope(definingLibrary, errorListener);
     JUnitTestCase.assertEquals(importedType, scope.lookup(ASTFactory.identifier3(importedTypeName), definingLibrary));
   }
-  void test_getDefiningLibrary() {
-    LibraryElement definingLibrary = createTestLibrary();
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    LibraryImportScope scope = new LibraryImportScope(definingLibrary, errorListener);
-    JUnitTestCase.assertEquals(definingLibrary, scope.definingLibrary);
-  }
   void test_getErrorListener() {
     LibraryElement definingLibrary = createTestLibrary();
     GatheringErrorListener errorListener = new GatheringErrorListener();
@@ -16775,10 +17119,6 @@
         final __test = new LibraryImportScopeTest();
         runJUnitTest(__test, __test.test_creation_nonEmpty);
       });
-      _ut.test('test_getDefiningLibrary', () {
-        final __test = new LibraryImportScopeTest();
-        runJUnitTest(__test, __test.test_getDefiningLibrary);
-      });
       _ut.test('test_getErrorListener', () {
         final __test = new LibraryImportScopeTest();
         runJUnitTest(__test, __test.test_getErrorListener);
@@ -17083,12 +17423,6 @@
     Scope scope = new LibraryScope(definingLibrary, errorListener);
     JUnitTestCase.assertEquals(importedType, scope.lookup(ASTFactory.identifier3(importedTypeName), definingLibrary));
   }
-  void test_getDefiningLibrary() {
-    LibraryElement definingLibrary = createTestLibrary();
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    LibraryScope scope = new LibraryScope(definingLibrary, errorListener);
-    JUnitTestCase.assertEquals(definingLibrary, scope.definingLibrary);
-  }
   void test_getErrorListener() {
     LibraryElement definingLibrary = createTestLibrary();
     GatheringErrorListener errorListener = new GatheringErrorListener();
@@ -17105,10 +17439,6 @@
         final __test = new LibraryScopeTest();
         runJUnitTest(__test, __test.test_creation_nonEmpty);
       });
-      _ut.test('test_getDefiningLibrary', () {
-        final __test = new LibraryScopeTest();
-        runJUnitTest(__test, __test.test_getDefiningLibrary);
-      });
       _ut.test('test_getErrorListener', () {
         final __test = new LibraryScopeTest();
         runJUnitTest(__test, __test.test_getErrorListener);
@@ -18384,6 +18714,7 @@
   void test_proxy_annotation_prefixed() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
+        "import 'meta.dart';",
         "@proxy",
         "class A {}",
         "f(var a) {",
@@ -18395,12 +18726,17 @@
         "  a++;",
         "  ++a;",
         "}"]));
+    addSource2("/meta.dart", EngineTestCase.createSource([
+        "library meta;",
+        "const proxy = const _Proxy();",
+        "class _Proxy { const _Proxy(); }"]));
     resolve(source);
     assertNoErrors(source);
   }
   void test_proxy_annotation_prefixed2() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
+        "import 'meta.dart';",
         "@proxy",
         "class A {}",
         "class B {",
@@ -18414,12 +18750,17 @@
         "    ++a;",
         "  }",
         "}"]));
+    addSource2("/meta.dart", EngineTestCase.createSource([
+        "library meta;",
+        "const proxy = const _Proxy();",
+        "class _Proxy { const _Proxy(); }"]));
     resolve(source);
     assertNoErrors(source);
   }
   void test_proxy_annotation_prefixed3() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
+        "import 'meta.dart';",
         "class B {",
         "  f(var a) {",
         "    a = new A();",
@@ -18433,6 +18774,10 @@
         "}",
         "@proxy",
         "class A {}"]));
+    addSource2("/meta.dart", EngineTestCase.createSource([
+        "library meta;",
+        "const proxy = const _Proxy();",
+        "class _Proxy { const _Proxy(); }"]));
     resolve(source);
     assertNoErrors(source);
   }
@@ -18828,9 +19173,8 @@
 }
 class EnclosedScopeTest extends ResolverTestCase {
   void test_define_duplicate() {
-    LibraryElement definingLibrary2 = createTestLibrary();
     GatheringErrorListener errorListener2 = new GatheringErrorListener();
-    Scope rootScope = new Scope_21(definingLibrary2, errorListener2);
+    Scope rootScope = new Scope_21(errorListener2);
     EnclosedScope scope = new EnclosedScope(rootScope);
     VariableElement element1 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
     VariableElement element2 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
@@ -18839,9 +19183,8 @@
     errorListener2.assertErrors3([ErrorSeverity.ERROR]);
   }
   void test_define_normal() {
-    LibraryElement definingLibrary3 = createTestLibrary();
     GatheringErrorListener errorListener3 = new GatheringErrorListener();
-    Scope rootScope = new Scope_22(definingLibrary3, errorListener3);
+    Scope rootScope = new Scope_22(errorListener3);
     EnclosedScope outerScope = new EnclosedScope(rootScope);
     EnclosedScope innerScope = new EnclosedScope(outerScope);
     VariableElement element1 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
@@ -18864,18 +19207,14 @@
   }
 }
 class Scope_21 extends Scope {
-  LibraryElement definingLibrary2;
   GatheringErrorListener errorListener2;
-  Scope_21(this.definingLibrary2, this.errorListener2) : super();
-  LibraryElement get definingLibrary => definingLibrary2;
+  Scope_21(this.errorListener2) : super();
   AnalysisErrorListener get errorListener => errorListener2;
   Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
 }
 class Scope_22 extends Scope {
-  LibraryElement definingLibrary3;
   GatheringErrorListener errorListener3;
-  Scope_22(this.definingLibrary3, this.errorListener3) : super();
-  LibraryElement get definingLibrary => definingLibrary3;
+  Scope_22(this.errorListener3) : super();
   AnalysisErrorListener get errorListener => errorListener3;
   Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
 }
@@ -19068,9 +19407,8 @@
 }
 class ScopeTest extends ResolverTestCase {
   void test_define_duplicate() {
-    LibraryElement definingLibrary = createTestLibrary();
     GatheringErrorListener errorListener = new GatheringErrorListener();
-    ScopeTest_TestScope scope = new ScopeTest_TestScope(definingLibrary, errorListener);
+    ScopeTest_TestScope scope = new ScopeTest_TestScope(errorListener);
     VariableElement element1 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
     VariableElement element2 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
     scope.define(element1);
@@ -19078,24 +19416,17 @@
     errorListener.assertErrors3([ErrorSeverity.ERROR]);
   }
   void test_define_normal() {
-    LibraryElement definingLibrary = createTestLibrary();
     GatheringErrorListener errorListener = new GatheringErrorListener();
-    ScopeTest_TestScope scope = new ScopeTest_TestScope(definingLibrary, errorListener);
+    ScopeTest_TestScope scope = new ScopeTest_TestScope(errorListener);
     VariableElement element1 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
     VariableElement element2 = ElementFactory.localVariableElement(ASTFactory.identifier3("v2"));
     scope.define(element1);
     scope.define(element2);
     errorListener.assertNoErrors();
   }
-  void test_getDefiningLibrary() {
-    LibraryElement definingLibrary = createTestLibrary();
-    ScopeTest_TestScope scope = new ScopeTest_TestScope(definingLibrary, null);
-    JUnitTestCase.assertEquals(definingLibrary, scope.definingLibrary);
-  }
   void test_getErrorListener() {
-    LibraryElement definingLibrary = new LibraryElementImpl(new AnalysisContextImpl(), ASTFactory.libraryIdentifier2(["test"]));
     GatheringErrorListener errorListener = new GatheringErrorListener();
-    ScopeTest_TestScope scope = new ScopeTest_TestScope(definingLibrary, errorListener);
+    ScopeTest_TestScope scope = new ScopeTest_TestScope(errorListener);
     JUnitTestCase.assertEquals(errorListener, scope.errorListener);
   }
   void test_isPrivateName_nonPrivate() {
@@ -19114,10 +19445,6 @@
         final __test = new ScopeTest();
         runJUnitTest(__test, __test.test_define_normal);
       });
-      _ut.test('test_getDefiningLibrary', () {
-        final __test = new ScopeTest();
-        runJUnitTest(__test, __test.test_getDefiningLibrary);
-      });
       _ut.test('test_getErrorListener', () {
         final __test = new ScopeTest();
         runJUnitTest(__test, __test.test_getErrorListener);
@@ -19139,19 +19466,12 @@
 class ScopeTest_TestScope extends Scope {
 
   /**
-   * The element representing the library in which this scope is enclosed.
-   */
-  LibraryElement _definingLibrary;
-
-  /**
    * The listener that is to be informed when an error is encountered.
    */
   AnalysisErrorListener _errorListener;
-  ScopeTest_TestScope(LibraryElement definingLibrary, AnalysisErrorListener errorListener) {
-    this._definingLibrary = definingLibrary;
+  ScopeTest_TestScope(AnalysisErrorListener errorListener) {
     this._errorListener = errorListener;
   }
-  LibraryElement get definingLibrary => _definingLibrary;
   AnalysisErrorListener get errorListener => _errorListener;
   Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) => localLookup(name, referencingLibrary);
 }
@@ -20042,4 +20362,4 @@
 //  StaticWarningCodeTest.dartSuite();
 //  StrictModeTest.dartSuite();
 //  TypePropagationTest.dartSuite();
-}
+}
\ No newline at end of file
diff --git a/pkg/analyzer/test/generated/scanner_test.dart b/pkg/analyzer/test/generated/scanner_test.dart
index 1f830c6..8702c38 100644
--- a/pkg/analyzer/test/generated/scanner_test.dart
+++ b/pkg/analyzer/test/generated/scanner_test.dart
@@ -6,6 +6,7 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/utilities_collection.dart' show TokenMap;
 import 'package:unittest/unittest.dart' as _ut;
 import 'test_support.dart';
 class KeywordStateTest extends JUnitTestCase {
@@ -727,7 +728,7 @@
     assertToken(TokenType.STRING, "'''string'''");
   }
   void test_string_multi_slashEnter() {
-    assertError(ScannerErrorCode.CHARACTER_EXPECTED_AFTER_SLASH, 0, "'''\\\n'''");
+    assertToken(TokenType.STRING, "'''\\\n'''");
   }
   void test_string_multi_unterminated() {
     assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "'''string");
@@ -1667,17 +1668,123 @@
     this._columnNumber = columnNumber;
   }
 }
-class IncrementalScannerTest extends JUnitTestCase {
-  void test_rescan_addedToIdentifier() {
-    assertTokens("a + b;", "abs + b;");
+class IncrementalScannerTest extends EngineTestCase {
+  Token _originalTokens;
+  void test_rescan_addedBeforeIdentifier1() {
+    IncrementalScanner scanner = assertTokens("a + b;", "xa + b;");
+    JUnitTestCase.assertEquals("xa", scanner.firstToken.lexeme);
+    JUnitTestCase.assertEquals("xa", scanner.lastToken.lexeme);
+  }
+  void test_rescan_addedBeforeIdentifier2() {
+    IncrementalScanner scanner = assertTokens("a + b;", "a + xb;");
+    JUnitTestCase.assertEquals("xb", scanner.firstToken.lexeme);
+    JUnitTestCase.assertEquals("xb", scanner.lastToken.lexeme);
+  }
+  void test_rescan_addedNewIdentifier1() {
+    IncrementalScanner scanner = assertTokens("a;  c;", "a; b c;");
+    JUnitTestCase.assertEquals("b", scanner.firstToken.lexeme);
+    JUnitTestCase.assertEquals("b", scanner.lastToken.lexeme);
+  }
+  void test_rescan_addedNewIdentifier2() {
+    IncrementalScanner scanner = assertTokens("a;  c;", "a;b  c;");
+    JUnitTestCase.assertEquals("b", scanner.firstToken.lexeme);
+    JUnitTestCase.assertEquals("b", scanner.lastToken.lexeme);
+    Token oldToken = _originalTokens.next;
+    JUnitTestCase.assertSame(TokenType.SEMICOLON, oldToken.type);
+    Token newToken = scanner.tokenMap.get(oldToken);
+    JUnitTestCase.assertNotNull(newToken);
+    JUnitTestCase.assertEquals(TokenType.SEMICOLON, newToken.type);
+    JUnitTestCase.assertNotSame(oldToken, newToken);
+  }
+  void test_rescan_addedToIdentifier1() {
+    IncrementalScanner scanner = assertTokens("a + b;", "abs + b;");
+    JUnitTestCase.assertEquals("abs", scanner.firstToken.lexeme);
+    JUnitTestCase.assertEquals("abs", scanner.lastToken.lexeme);
+    Token oldToken = _originalTokens.next;
+    JUnitTestCase.assertEquals(TokenType.PLUS, oldToken.type);
+    Token newToken = scanner.tokenMap.get(oldToken);
+    JUnitTestCase.assertNotNull(newToken);
+    JUnitTestCase.assertEquals(TokenType.PLUS, newToken.type);
+    JUnitTestCase.assertNotSame(oldToken, newToken);
+  }
+  void test_rescan_addedToIdentifier2() {
+    IncrementalScanner scanner = assertTokens("a + b;", "a + by;");
+    JUnitTestCase.assertEquals("by", scanner.firstToken.lexeme);
+    JUnitTestCase.assertEquals("by", scanner.lastToken.lexeme);
+  }
+  void test_rescan_appendWhitespace1() {
+    IncrementalScanner scanner = assertTokens("a + b;", "a + b; ");
+    JUnitTestCase.assertNull(scanner.firstToken);
+    JUnitTestCase.assertNull(scanner.lastToken);
+  }
+  void test_rescan_appendWhitespace2() {
+    IncrementalScanner scanner = assertTokens("a + b; ", "a + b;  ");
+    JUnitTestCase.assertNull(scanner.firstToken);
+    JUnitTestCase.assertNull(scanner.lastToken);
   }
   void test_rescan_insertedPeriod() {
-    assertTokens("a + b;", "a + b.;");
+    IncrementalScanner scanner = assertTokens("a + b;", "a + b.;");
+    JUnitTestCase.assertEquals(".", scanner.firstToken.lexeme);
+    JUnitTestCase.assertEquals(".", scanner.lastToken.lexeme);
+  }
+  void test_rescan_insertedPeriodBetweenIdentifiers1() {
+    IncrementalScanner scanner = assertTokens("a b;", "a. b;");
+    JUnitTestCase.assertEquals(".", scanner.firstToken.lexeme);
+    JUnitTestCase.assertEquals(".", scanner.lastToken.lexeme);
+  }
+  void test_rescan_insertedPeriodBetweenIdentifiers2() {
+    IncrementalScanner scanner = assertTokens("a b;", "a .b;");
+    JUnitTestCase.assertEquals(".", scanner.firstToken.lexeme);
+    JUnitTestCase.assertEquals(".", scanner.lastToken.lexeme);
+  }
+  void test_rescan_insertedPeriodBetweenIdentifiers3() {
+    IncrementalScanner scanner = assertTokens("a  b;", "a . b;");
+    JUnitTestCase.assertEquals(".", scanner.firstToken.lexeme);
+    JUnitTestCase.assertEquals(".", scanner.lastToken.lexeme);
+  }
+  void test_rescan_insertedPeriodIdentifier() {
+    IncrementalScanner scanner = assertTokens("a + b;", "a + b.x;");
+    JUnitTestCase.assertEquals(".", scanner.firstToken.lexeme);
+    JUnitTestCase.assertEquals("x", scanner.lastToken.lexeme);
+  }
+  void test_rescan_insertedPeriodInsideExistingIdentifier() {
+    IncrementalScanner scanner = assertTokens("ab;", "a.b;");
+    JUnitTestCase.assertEquals("a", scanner.firstToken.lexeme);
+    JUnitTestCase.assertEquals("b", scanner.lastToken.lexeme);
+  }
+  void test_rescan_insertLeadingWhitespace() {
+    IncrementalScanner scanner = assertTokens("a + b;", " a + b;");
+    JUnitTestCase.assertNull(scanner.firstToken);
+    JUnitTestCase.assertNull(scanner.lastToken);
+  }
+  void test_rescan_insertWhitespace() {
+    IncrementalScanner scanner = assertTokens("a + b;", "a  + b;");
+    JUnitTestCase.assertNull(scanner.firstToken);
+    JUnitTestCase.assertNull(scanner.lastToken);
+  }
+  void test_rescan_insertWhitespaceWithMultipleComments() {
+    IncrementalScanner scanner = assertTokens(EngineTestCase.createSource(["//comment", "//comment2", "a + b;"]), EngineTestCase.createSource(["//comment", "//comment2", "a  + b;"]));
+    JUnitTestCase.assertNull(scanner.firstToken);
+    JUnitTestCase.assertNull(scanner.lastToken);
   }
   void test_rescan_oneFunctionToTwo() {
-    assertTokens("f() {}", "f() => 0; g() {}");
+    IncrementalScanner scanner = assertTokens("f() {}", "f() => 0; g() {}");
+    JUnitTestCase.assertEquals("=>", scanner.firstToken.lexeme);
+    JUnitTestCase.assertEquals(")", scanner.lastToken.lexeme);
   }
-  void assertTokens(String originalContents, String modifiedContents) {
+  void test_tokenMap() {
+    IncrementalScanner scanner = assertTokens("main() {a + b;}", "main() { a + b;}");
+    TokenMap tokenMap = scanner.tokenMap;
+    Token oldToken = _originalTokens;
+    while (oldToken.type != TokenType.EOF) {
+      Token newToken = tokenMap.get(oldToken);
+      JUnitTestCase.assertNotSame(oldToken, newToken);
+      JUnitTestCase.assertSame(oldToken.type, newToken.type);
+      JUnitTestCase.assertEquals(oldToken.lexeme, newToken.lexeme);
+      oldToken = oldToken.next;
+    }
+  }
+  IncrementalScanner assertTokens(String originalContents, String modifiedContents) {
     int originalLength = originalContents.length;
     int modifiedLength = modifiedContents.length;
     int replaceStart = 0;
@@ -1693,41 +1800,107 @@
     Source source = new TestSource();
     GatheringErrorListener originalListener = new GatheringErrorListener();
     Scanner originalScanner = new Scanner(source, new CharSequenceReader(new CharSequence(originalContents)), originalListener);
-    Token originalToken = originalScanner.tokenize();
-    JUnitTestCase.assertNotNull(originalToken);
+    _originalTokens = originalScanner.tokenize();
+    JUnitTestCase.assertNotNull(_originalTokens);
     GatheringErrorListener modifiedListener = new GatheringErrorListener();
     Scanner modifiedScanner = new Scanner(source, new CharSequenceReader(new CharSequence(modifiedContents)), modifiedListener);
-    Token modifiedToken = modifiedScanner.tokenize();
-    JUnitTestCase.assertNotNull(modifiedToken);
+    Token modifiedTokens = modifiedScanner.tokenize();
+    JUnitTestCase.assertNotNull(modifiedTokens);
     GatheringErrorListener incrementalListener = new GatheringErrorListener();
     IncrementalScanner incrementalScanner = new IncrementalScanner(source, new CharSequenceReader(new CharSequence(modifiedContents)), incrementalListener);
-    Token incrementalToken = incrementalScanner.rescan(originalToken, replaceStart, originalEnd - replaceStart + 1, modifiedEnd - replaceStart + 1);
+    Token incrementalTokens = incrementalScanner.rescan(_originalTokens, replaceStart, originalEnd - replaceStart + 1, modifiedEnd - replaceStart + 1);
+    Token incrementalToken = incrementalTokens;
     JUnitTestCase.assertNotNull(incrementalToken);
-    while (incrementalToken.type != TokenType.EOF && modifiedToken.type != TokenType.EOF) {
-      JUnitTestCase.assertSameMsg("Wrong type for token", modifiedToken.type, incrementalToken.type);
-      JUnitTestCase.assertEqualsMsg("Wrong offset for token", modifiedToken.offset, incrementalToken.offset);
-      JUnitTestCase.assertEqualsMsg("Wrong length for token", modifiedToken.length, incrementalToken.length);
-      JUnitTestCase.assertEqualsMsg("Wrong lexeme for token", modifiedToken.lexeme, incrementalToken.lexeme);
+    while (incrementalToken.type != TokenType.EOF && modifiedTokens.type != TokenType.EOF) {
+      JUnitTestCase.assertSameMsg("Wrong type for token", modifiedTokens.type, incrementalToken.type);
+      JUnitTestCase.assertEqualsMsg("Wrong offset for token", modifiedTokens.offset, incrementalToken.offset);
+      JUnitTestCase.assertEqualsMsg("Wrong length for token", modifiedTokens.length, incrementalToken.length);
+      JUnitTestCase.assertEqualsMsg("Wrong lexeme for token", modifiedTokens.lexeme, incrementalToken.lexeme);
       incrementalToken = incrementalToken.next;
-      modifiedToken = modifiedToken.next;
+      modifiedTokens = modifiedTokens.next;
     }
     JUnitTestCase.assertSameMsg("Too many tokens", TokenType.EOF, incrementalToken.type);
-    JUnitTestCase.assertSameMsg("Not enough tokens", TokenType.EOF, modifiedToken.type);
+    JUnitTestCase.assertSameMsg("Not enough tokens", TokenType.EOF, modifiedTokens.type);
+    return incrementalScanner;
   }
   static dartSuite() {
     _ut.group('IncrementalScannerTest', () {
-      _ut.test('test_rescan_addedToIdentifier', () {
+      _ut.test('test_rescan_addedBeforeIdentifier1', () {
         final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_rescan_addedToIdentifier);
+        runJUnitTest(__test, __test.test_rescan_addedBeforeIdentifier1);
+      });
+      _ut.test('test_rescan_addedBeforeIdentifier2', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_addedBeforeIdentifier2);
+      });
+      _ut.test('test_rescan_addedNewIdentifier1', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_addedNewIdentifier1);
+      });
+      _ut.test('test_rescan_addedNewIdentifier2', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_addedNewIdentifier2);
+      });
+      _ut.test('test_rescan_addedToIdentifier1', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_addedToIdentifier1);
+      });
+      _ut.test('test_rescan_addedToIdentifier2', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_addedToIdentifier2);
+      });
+      _ut.test('test_rescan_appendWhitespace1', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_appendWhitespace1);
+      });
+      _ut.test('test_rescan_appendWhitespace2', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_appendWhitespace2);
+      });
+      _ut.test('test_rescan_insertLeadingWhitespace', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_insertLeadingWhitespace);
+      });
+      _ut.test('test_rescan_insertWhitespace', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_insertWhitespace);
+      });
+      _ut.test('test_rescan_insertWhitespaceWithMultipleComments', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_insertWhitespaceWithMultipleComments);
       });
       _ut.test('test_rescan_insertedPeriod', () {
         final __test = new IncrementalScannerTest();
         runJUnitTest(__test, __test.test_rescan_insertedPeriod);
       });
+      _ut.test('test_rescan_insertedPeriodBetweenIdentifiers1', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_insertedPeriodBetweenIdentifiers1);
+      });
+      _ut.test('test_rescan_insertedPeriodBetweenIdentifiers2', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_insertedPeriodBetweenIdentifiers2);
+      });
+      _ut.test('test_rescan_insertedPeriodBetweenIdentifiers3', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_insertedPeriodBetweenIdentifiers3);
+      });
+      _ut.test('test_rescan_insertedPeriodIdentifier', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_insertedPeriodIdentifier);
+      });
+      _ut.test('test_rescan_insertedPeriodInsideExistingIdentifier', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_insertedPeriodInsideExistingIdentifier);
+      });
       _ut.test('test_rescan_oneFunctionToTwo', () {
         final __test = new IncrementalScannerTest();
         runJUnitTest(__test, __test.test_rescan_oneFunctionToTwo);
       });
+      _ut.test('test_tokenMap', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_tokenMap);
+      });
     });
   }
 }
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index aebb0d2..ac118a1 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -283,7 +283,7 @@
    * @param secondError the second error being compared
    * @return `true` if the two errors are equivalent
    */
-  bool equals3(AnalysisError firstError, AnalysisError secondError) => identical(firstError.errorCode, secondError.errorCode) && firstError.offset == secondError.offset && firstError.length == secondError.length && equals4(firstError.source, secondError.source);
+  bool equals4(AnalysisError firstError, AnalysisError secondError) => identical(firstError.errorCode, secondError.errorCode) && firstError.offset == secondError.offset && firstError.length == secondError.length && equals5(firstError.source, secondError.source);
 
   /**
    * Return `true` if the two sources are equivalent.
@@ -292,7 +292,7 @@
    * @param secondSource the second source being compared
    * @return `true` if the two sources are equivalent
    */
-  bool equals4(Source firstSource, Source secondSource) {
+  bool equals5(Source firstSource, Source secondSource) {
     if (firstSource == null) {
       return secondSource == null;
     } else if (secondSource == null) {
@@ -376,7 +376,7 @@
    */
   bool foundAndRemoved(List<AnalysisError> errors, AnalysisError targetError) {
     for (AnalysisError error in errors) {
-      if (equals3(error, targetError)) {
+      if (equals4(error, targetError)) {
         errors.remove(error);
         return true;
       }
diff --git a/pkg/logging/lib/logging.dart b/pkg/logging/lib/logging.dart
index efbe9ba..25213bb 100644
--- a/pkg/logging/lib/logging.dart
+++ b/pkg/logging/lib/logging.dart
@@ -3,14 +3,50 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /**
- * Support for debugging and error logging.
- *
- * This library introduces abstractions similar to those used in other
- * languages, such as the Closure JS Logger and java.util.logging.Logger.
+ * Support for logging.
  *
  * For information on installing and importing this library, see the
  * [logging package on pub.dartlang.org]
  * (http://pub.dartlang.org/packages/logging).
+ *
+ * ## Initializing
+ *
+ * By default, the logging package does not do anything useful with the
+ * log messages. You must configure the logging level and add a handler
+ * for the log messages.
+ *
+ * Here is a simple logging configuration that logs all messages
+ * via `print`.
+ *
+ *     Logger.root.level = Level.ALL;
+ *     Logger.root.onRecord.listen((LogRecord rec) {
+ *       print('${rec.level.name}: ${rec.time}: ${rec.message}');
+ *     });
+ *
+ * First, set the root [Level]. All messages at or above the level are
+ * sent to the [onRecord] stream.
+ *
+ * Then, listen on the [onRecord] stream for [LogRecord] events. The
+ * [LogRecord] class has various properties for the message, error,
+ * logger name, and more.
+ *
+ * ## Logging messages
+ *
+ * Create a [Logger] with a unique name to easily identify the source
+ * of the log messages.
+ *
+ *     final Logger log = new Logger('MyClassName');
+ *
+ * Here is an example of logging a debug message and an error:
+ *
+ *     Future future = doSomethingAsync();
+ *     future.then((result) {
+ *       log.fine('Got the result: $result');
+ *       processResult(result);
+ *     })
+ *     .catchError((e, stackTrace) => log.severe('Oh noes!', e, stackTrace));
+ *
+ * See the [Logger] class for the different logging methods.
  */
 library logging;
 
diff --git a/pkg/pkg.status b/pkg/pkg.status
index da33bb8..c14883e 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -51,6 +51,7 @@
 polymer/test/event_path_test: Skip #uses dart:html
 polymer/test/events_test: Skip #uses dart:html
 polymer/test/instance_attrs_test: Skip #uses dart:html
+polymer/test/nested_binding_test: Skip # uses dart:html
 polymer/test/noscript_test: Skip #uses dart:html
 polymer/test/prop_attr_bind_reflection_test: Skip #uses dart:html
 polymer/test/prop_attr_reflection_test: Skip #uses dart:html
@@ -98,6 +99,7 @@
 polymer/test/event_path_declarative_test: Pass, Timeout # Issue 13260
 polymer/test/event_path_test: Pass, Timeout # Issue 13260
 polymer/test/events_test: Pass, Timeout # Issue 13260
+polymer/test/nested_binding_test: Pass, Timeout # Issue 13260
 polymer/test/noscript_test: Pass, Timeout # Issue 13260
 polymer/test/prop_attr_reflection_test: Pass, Timeout # Issue 13260
 polymer/test/prop_attr_bind_reflection_test: Pass, Timeout # Issue 13260
@@ -150,9 +152,6 @@
 # minified.
 unittest/test/*_unminified_test: Skip # DO NOT COPY THIS UNLESS YOU WORK ON DART2JS
 
- # Issue 9217: Uses unspecified Type.toString.
-analyzer/test/generated/ast_test: Fail
-
 [ $compiler == dart2js && $browser ]
 stack_trace/test/vm_test: Fail, OK # VM-specific traces
 crypto/test/sha256_test: Slow, Pass
@@ -168,6 +167,10 @@
 http_server/test/http_body_test: Pass, Fail # Issue 14381
 
 [ $browser ]
+analyzer/test/generated/ast_test: Fail, OK # Uses dart:io.
+analyzer/test/generated/element_test: Fail, OK # Uses dart:io.
+analyzer/test/generated/parser_test: Fail, OK # Uses dart:io.
+analyzer/test/generated/resolver_test: Fail, OK # Uses dart:io.
 analyzer/test/error_test: Fail, Timeout, OK # Uses dart:io.
 analyzer/test/generated/element_test: Fail, OK # Uses dart:io.
 analyzer/test/generated/resolver_test: Fail, OK # Uses dart:io.
diff --git a/pkg/polymer/test/nested_binding_test.dart b/pkg/polymer/test/nested_binding_test.dart
new file mode 100644
index 0000000..ab991d9
--- /dev/null
+++ b/pkg/polymer/test/nested_binding_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library polymer.test.nested_binding_test;
+
+import 'dart:async';
+import 'dart:html';
+import 'package:polymer/polymer.dart';
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:unittest/matcher.dart';
+
+@CustomTag('my-test')
+class MyTest extends PolymerElement {
+  final List fruits = toObservable(['apples', 'oranges', 'pears']);
+
+  final _testDone = new Completer();
+
+  MyTest.created() : super.created();
+
+  _runTest(_) {
+    expect($['fruit'].text.trim(), 'Short name: [pears]');
+    _testDone.complete();
+  }
+
+  ready() {
+    onMutation($['fruit']).then(_runTest);
+  }
+}
+
+main() {
+  initPolymer();
+  useHtmlConfiguration();
+
+  setUp(() => Polymer.onReady);
+
+  test('ready called', () => (query('my-test') as MyTest)._testDone.future);
+}
diff --git a/pkg/polymer/test/nested_binding_test.html b/pkg/polymer/test/nested_binding_test.html
new file mode 100644
index 0000000..3e853cd
--- /dev/null
+++ b/pkg/polymer/test/nested_binding_test.html
@@ -0,0 +1,31 @@
+<!doctype html>
+<!--
+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.
+-->
+<html>
+  <!--polymer-test: this comment is needed for test_suite.dart-->
+  <head>
+    <title>nesting binding test</title>
+    <script src="packages/unittest/test_controller.js"></script>
+  </head>
+  <body>
+    <polymer-element name="my-test">
+      <template>
+        <h2>Fruits</h2>
+        <ul id="fruit">
+          <template repeat="{{fruit in fruits}}">
+            <template if="{{ fruit == 'pears' }}">
+              <li>Short name: [{{fruit}}]</li>
+            </template>
+          </template>
+        </ul>
+      </template>
+    </polymer-element>
+
+    <my-test></my-test>
+
+    <script type="application/dart" src="nested_binding_test.dart"></script>
+  </body>
+</html>
diff --git a/pkg/polymer_expressions/lib/polymer_expressions.dart b/pkg/polymer_expressions/lib/polymer_expressions.dart
index 354fb5e..0d4d061 100644
--- a/pkg/polymer_expressions/lib/polymer_expressions.dart
+++ b/pkg/polymer_expressions/lib/polymer_expressions.dart
@@ -70,6 +70,17 @@
   prepareBinding(String path, name, node) {
     if (path == null) return null;
     var expr = new Parser(path).parse();
+
+    // For template bind/repeat to an empty path, just pass through the model.
+    // We don't want to unwrap the Scope.
+    // TODO(jmesserly): a custom element extending <template> could notice this
+    // behavior. An alternative is to associate the Scope with the node via an
+    // Expando, which is what the JavaScript PolymerExpressions does.
+    if (isSemanticTemplate(node) && (name == 'bind' || name == 'repeat') &&
+        expr is EmptyExpression) {
+      return null;
+    }
+
     return (model, node) {
       if (model is! Scope) {
         model = new Scope(model: model, variables: globals);
diff --git a/pkg/shadow_dom/lib/shadow_dom.debug.js b/pkg/shadow_dom/lib/shadow_dom.debug.js
index c8a4d5b..2622ea3 100644
--- a/pkg/shadow_dom/lib/shadow_dom.debug.js
+++ b/pkg/shadow_dom/lib/shadow_dom.debug.js
@@ -32,24 +32,66 @@
 (function(global) {
   'use strict';
 
+  var PROP_ADD_TYPE = 'add';
+  var PROP_UPDATE_TYPE = 'update';
+  var PROP_RECONFIGURE_TYPE = 'reconfigure';
+  var PROP_DELETE_TYPE = 'delete';
+  var ARRAY_SPLICE_TYPE = 'splice';
+
+  // Detect and do basic sanity checking on Object/Array.observe.
   function detectObjectObserve() {
     if (typeof Object.observe !== 'function' ||
         typeof Array.observe !== 'function') {
       return false;
     }
 
-    var gotSplice = false;
-    function callback(records) {
-      if (records[0].type === 'splice' && records[1].type === 'splice')
-        gotSplice = true;
+    var records = [];
+
+    function callback(recs) {
+      records = recs;
     }
 
-    var test = [0];
+    var test = {};
+    Object.observe(test, callback);
+    test.id = 1;
+    test.id = 2;
+    delete test.id;
+    Object.deliverChangeRecords(callback);
+    if (records.length !== 3)
+      return false;
+
+    // TODO(rafaelw): Remove this when new change record type names make it to
+    // chrome release.
+    if (records[0].type == 'new' &&
+        records[1].type == 'updated' &&
+        records[2].type == 'deleted') {
+      PROP_ADD_TYPE = 'new';
+      PROP_UPDATE_TYPE = 'updated';
+      PROP_RECONFIGURE_TYPE = 'reconfigured';
+      PROP_DELETE_TYPE = 'deleted';
+    } else if (records[0].type != 'add' ||
+               records[1].type != 'update' ||
+               records[2].type != 'delete') {
+      console.error('Unexpected change record names for Object.observe. ' +
+                    'Using dirty-checking instead');
+      return false;
+    }
+    Object.unobserve(test, callback);
+
+    test = [0];
     Array.observe(test, callback);
     test[1] = 1;
     test.length = 0;
     Object.deliverChangeRecords(callback);
-    return gotSplice;
+    if (records.length != 2)
+      return false;
+    if (records[0].type != ARRAY_SPLICE_TYPE ||
+        records[1].type != ARRAY_SPLICE_TYPE) {
+      return false;
+    }
+    Array.unobserve(test, callback);
+
+    return true;
   }
 
   var hasObserve = detectObjectObserve();
@@ -836,11 +878,10 @@
     }
   });
 
-  var knownRecordTypes = {
-    'new': true,
-    'updated': true,
-    'deleted': true
-  };
+  var expectedRecordTypes = {};
+  expectedRecordTypes[PROP_ADD_TYPE] = true;
+  expectedRecordTypes[PROP_UPDATE_TYPE] = true;
+  expectedRecordTypes[PROP_DELETE_TYPE] = true;
 
   function notifyFunction(object, name) {
     if (typeof Object.observe !== 'function')
@@ -872,7 +913,7 @@
     var observer = new PathObserver(obj, descriptor.path,
         function(newValue, oldValue) {
           if (notify)
-            notify('updated', oldValue);
+            notify(PROP_UPDATE_TYPE, oldValue);
         }
     );
 
@@ -907,7 +948,7 @@
 
     for (var i = 0; i < changeRecords.length; i++) {
       var record = changeRecords[i];
-      if (!knownRecordTypes[record.type]) {
+      if (!expectedRecordTypes[record.type]) {
         console.error('Unknown changeRecord type: ' + record.type);
         console.error(record);
         continue;
@@ -916,10 +957,10 @@
       if (!(record.name in oldValues))
         oldValues[record.name] = record.oldValue;
 
-      if (record.type == 'updated')
+      if (record.type == PROP_UPDATE_TYPE)
         continue;
 
-      if (record.type == 'new') {
+      if (record.type == PROP_ADD_TYPE) {
         if (record.name in removed)
           delete removed[record.name];
         else
@@ -928,7 +969,7 @@
         continue;
       }
 
-      // type = 'deleted'
+      // type = 'delete'
       if (record.name in added) {
         delete added[record.name];
         delete oldValues[record.name];
@@ -1316,12 +1357,12 @@
     for (var i = 0; i < changeRecords.length; i++) {
       var record = changeRecords[i];
       switch(record.type) {
-        case 'splice':
+        case ARRAY_SPLICE_TYPE:
           mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);
           break;
-        case 'new':
-        case 'updated':
-        case 'deleted':
+        case PROP_ADD_TYPE:
+        case PROP_UPDATE_TYPE:
+        case PROP_DELETE_TYPE:
           if (!isIndex(record.name))
             continue;
           var index = toNumber(record.name);
@@ -1368,6 +1409,16 @@
   global.PathObserver = PathObserver;
   global.CompoundPathObserver = CompoundPathObserver;
   global.Path = Path;
+
+  // TODO(rafaelw): Only needed for testing until new change record names
+  // make it to release.
+  global.Observer.changeRecordTypes = {
+    add: PROP_ADD_TYPE,
+    update: PROP_UPDATE_TYPE,
+    reconfigure: PROP_RECONFIGURE_TYPE,
+    'delete': PROP_DELETE_TYPE,
+    splice: ARRAY_SPLICE_TYPE
+  };
 })(typeof global !== 'undefined' && global ? global : this);
 
 /*
@@ -1430,6 +1481,7 @@
       var f = new Function('', 'return true;');
       hasEval = f();
     } catch (ex) {
+      hasEval = false;
     }
   }
 
@@ -1780,6 +1832,7 @@
   scope.wrappers = wrappers;
 
 })(this.ShadowDOMPolyfill);
+
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
 // license that can be found in the LICENSE file.
@@ -4872,6 +4925,7 @@
       });
 
       var nativeConstructor = originalRegister.call(unwrap(this), tagName,
+          object.extends ? {prototype: newPrototype, extends: object.extends} :
           {prototype: newPrototype});
 
       function GeneratedWrapper(node) {
diff --git a/pkg/shadow_dom/lib/shadow_dom.min.js b/pkg/shadow_dom/lib/shadow_dom.min.js
index 2017c03..3f339be 100644
--- a/pkg/shadow_dom/lib/shadow_dom.min.js
+++ b/pkg/shadow_dom/lib/shadow_dom.min.js
@@ -1,3 +1,3 @@
-if(!HTMLElement.prototype.createShadowRoot||window.__forceShadowDomPolyfill){!function(){Element.prototype.webkitCreateShadowRoot&&(Element.prototype.webkitCreateShadowRoot=function(){return window.ShadowDOMPolyfill.wrapIfNeeded(this).createShadowRoot()})}(),function(a){"use strict";function b(){function a(a){"splice"===a[0].type&&"splice"===a[1].type&&(b=!0)}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=!1,c=[0];return Array.observe(c,a),c[1]=1,c.length=0,Object.deliverChangeRecords(a),b}function c(){if(a.document&&"securityPolicy"in a.document&&!a.document.securityPolicy.allowsEval)return!1;try{var b=new Function("","return true;");return b()}catch(c){return!1}}function d(a){return+a===a>>>0}function e(a){return+a}function f(a){return a===Object(a)}function g(a,b){return a===b?0!==a||1/a===1/b:H(a)&&H(b)?!0:a!==a&&b!==b}function h(a){return"string"!=typeof a?!1:(a=a.trim(),""==a?!0:"."==a[0]?!1:P.test(a))}function i(a,b){if(b!==Q)throw Error("Use Path.get to retrieve path objects");return""==a.trim()?this:d(a)?(this.push(a),this):(a.split(/\s*\.\s*/).filter(function(a){return a}).forEach(function(a){this.push(a)},this),G&&!F&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn()),void 0)}function j(a){if(a instanceof i)return a;null==a&&(a=""),"string"!=typeof a&&(a=String(a));var b=R[a];if(b)return b;if(!h(a))return S;var b=new i(a,Q);return R[a]=b,b}function k(b){for(var c=0;T>c&&b.check();)b.report(),c++;a.testingExposeCycleCount&&(a.dirtyCheckCycleCount=c)}function l(a){for(var b in a)return!1;return!0}function m(a){return l(a.added)&&l(a.removed)&&l(a.changed)}function n(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function o(a,b){var c=b||(Array.isArray(a)?[]:{});for(var d in a)c[d]=a[d];return Array.isArray(a)&&(c.length=a.length),c}function p(a,b,c,d){if(this.closed=!1,this.object=a,this.callback=b,this.target=c,this.token=d,this.reporting=!0,F){var e=this;this.boundInternalCallback=function(a){e.internalCallback(a)}}q(this)}function q(a){V&&(U.push(a),p._allObserversCount++)}function r(a,b,c,d){p.call(this,a,b,c,d),this.connect(),this.sync(!0)}function s(a,b,c,d){if(!Array.isArray(a))throw Error("Provided object is not an Array");r.call(this,a,b,c,d)}function t(a){this.arr=[],this.callback=a,this.isObserved=!0}function u(a,b,c,d,e,g,h){var b=b instanceof i?b:j(b);return b&&b.length&&f(a)?(p.call(this,a,c,d,e),this.valueFn=g,this.setValueFn=h,this.path=b,this.connect(),this.sync(!0),void 0):(this.value_=b?b.getValueFrom(a):void 0,this.value=g?g(this.value_):this.value_,this.closed=!0,void 0)}function v(a,b,c,d){p.call(this,void 0,a,b,c),this.valueFn=d,this.observed=[],this.values=[],this.value=void 0,this.oldValue=void 0,this.oldValues=void 0,this.changeFlags=void 0,this.started=!1}function w(a,b){if("function"==typeof Object.observe){var c=Object.getNotifier(a);return function(d,e){var f={object:a,type:d,name:b};2===arguments.length&&(f.oldValue=e),c.notify(f)}}}function x(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];$[g.type]?(g.name in c||(c[g.name]=g.oldValue),"updated"!=g.type&&("new"!=g.type?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function y(a,b,c){return{index:a,removed:b,addedCount:c}}function z(){}function A(a,b,c,d,e,f){return db.calcSplices(a,b,c,d,e,f)}function B(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function C(a,b,c,d){for(var e=y(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=B(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function D(a,b){for(var c=[],f=0;f<b.length;f++){var g=b[f];switch(g.type){case"splice":C(c,g.index,g.removed.slice(),g.addedCount);break;case"new":case"updated":case"deleted":if(!d(g.name))continue;var h=e(g.name);if(0>h)continue;C(c,h,[g.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(g))}}return c}function E(a,b){var c=[];return D(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?(b.removed[0]!==a[b.index]&&c.push(b),void 0):(c=c.concat(A(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)),void 0)}),c}var F=b(),G=c(),H=a.Number.isNaN||function(b){return"number"==typeof b&&a.isNaN(b)},I="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},J="[$_a-zA-Z]",K="[$_a-zA-Z0-9]",L=J+"+"+K+"*",M="(?:[0-9]|[1-9]+[0-9]+)",N="(?:"+L+"|"+M+")",O="(?:"+N+")(?:\\s*\\.\\s*"+N+")*",P=new RegExp("^"+O+"$"),Q={},R={};i.get=j,i.prototype=I({__proto__:[],valid:!0,toString:function(){return this.join(".")},getValueFrom:function(a,b){for(var c=0;c<this.length;c++){if(null==a)return;b&&b.observe(a),a=a[this[c]]}return a},compiledGetValueFromFn:function(){var a=this.map(function(a){return d(a)?'["'+a+'"]':"."+a}),b="",c="obj";b+="if (obj != null";for(var e=0;e<this.length-1;e++)this[e],c+=a[e],b+=" &&\n     "+c+" != null";return b+=")\n",c+=a[e],b+="  return "+c+";\nelse\n  return undefined;",new Function("obj",b)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!f(a))return!1;a=a[this[c]]}return f(a)?(a[this[c]]=b,!0):!1}});var S=new i("",Q);S.valid=!1,S.getValueFrom=S.setValueFrom=function(){};var T=1e3;p.prototype={internalCallback:function(a){this.closed||this.reporting&&this.check(a)&&(this.report(),this.testingResults&&(this.testingResults.anyChanged=!0))},close:function(){this.closed||(this.object&&"function"==typeof this.object.close&&this.object.close(),this.disconnect(),this.object=void 0,this.closed=!0)},deliver:function(a){this.closed||(F?(this.testingResults=a,Object.deliverChangeRecords(this.boundInternalCallback),this.testingResults=void 0):k(this))},report:function(){this.reporting&&(this.sync(!1),this.callback&&(this.reportArgs.push(this.token),this.invokeCallback(this.reportArgs)),this.reportArgs=void 0)},invokeCallback:function(a){try{this.callback.apply(this.target,a)}catch(b){p._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},reset:function(){this.closed||(F&&(this.reporting=!1,Object.deliverChangeRecords(this.boundInternalCallback),this.reporting=!0),this.sync(!0))}};var U,V=!F||a.forceCollectObservers;p._allObserversCount=0,V&&(U=[]);var W=!1,X="function"==typeof Object.deliverAllChangeRecords;a.Platform=a.Platform||{},a.Platform.performMicrotaskCheckpoint=function(){if(!W){if(X)return Object.deliverAllChangeRecords(),void 0;if(V){W=!0;var b=0,c={};do{b++;var d=U;U=[],c.anyChanged=!1;for(var e=0;e<d.length;e++){var f=d[e];f.closed||(F?f.deliver(c):f.check()&&(c.anyChanged=!0,f.report()),U.push(f))}}while(T>b&&c.anyChanged);a.testingExposeCycleCount&&(a.dirtyCheckCycleCount=b),p._allObserversCount=U.length,W=!1}}},V&&(a.Platform.clearObservers=function(){U=[]}),r.prototype=I({__proto__:p.prototype,connect:function(){F&&Object.observe(this.object,this.boundInternalCallback)},sync:function(){F||(this.oldObject=o(this.object))},check:function(a){var b,c;if(F){if(!a)return!1;c={},b=x(this.object,a,c)}else c=this.oldObject,b=n(this.object,this.oldObject);return m(b)?!1:(this.reportArgs=[b.added||{},b.removed||{},b.changed||{}],this.reportArgs.push(function(a){return c[a]}),!0)},disconnect:function(){F?this.object&&Object.unobserve(this.object,this.boundInternalCallback):this.oldObject=void 0}}),s.prototype=I({__proto__:r.prototype,connect:function(){F&&Array.observe(this.object,this.boundInternalCallback)},sync:function(){F||(this.oldObject=this.object.slice())},check:function(a){var b;if(F){if(!a)return!1;b=E(this.object,a)}else b=A(this.object,0,this.object.length,this.oldObject,0,this.oldObject.length);return b&&b.length?(this.reportArgs=[b],!0):!1}}),s.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})};var Y=Object.getPrototypeOf({}),Z=Object.getPrototypeOf([]);t.prototype={reset:function(){this.isObserved=!this.isObserved},observe:function(a){if(f(a)&&a!==Y&&a!==Z){var b=this.arr.indexOf(a);b>=0&&this.arr[b+1]===this.isObserved||(0>b&&(b=this.arr.length,this.arr[b]=a,Object.observe(a,this.callback)),this.arr[b+1]=this.isObserved,this.observe(Object.getPrototypeOf(a)))}},cleanup:function(){for(var a=0,b=0,c=this.isObserved;b<this.arr.length;){var d=this.arr[b];this.arr[b+1]==c?(b>a&&(this.arr[a]=d,this.arr[a+1]=c),a+=2):Object.unobserve(d,this.callback),b+=2}this.arr.length=a}},u.prototype=I({__proto__:p.prototype,connect:function(){F&&(this.observedSet=new t(this.boundInternalCallback))},disconnect:function(){this.value=void 0,this.value_=void 0,this.observedSet&&(this.observedSet.reset(),this.observedSet.cleanup(),this.observedSet=void 0)},check:function(){return this.observedSet&&this.observedSet.reset(),this.value_=this.path.getValueFrom(this.object,this.observedSet),this.observedSet&&this.observedSet.cleanup(),g(this.value_,this.oldValue_)?!1:(this.value=this.valueFn?this.valueFn(this.value_):this.value_,this.reportArgs=[this.value,this.oldValue],!0)},sync:function(a){a&&(this.observedSet&&this.observedSet.reset(),this.value_=this.path.getValueFrom(this.object,this.observedSet),this.value=this.valueFn?this.valueFn(this.value_):this.value_,this.observedSet&&this.observedSet.cleanup()),this.oldValue_=this.value_,this.oldValue=this.value},setValue:function(a){this.path&&("function"==typeof this.setValueFn&&(a=this.setValueFn(a)),this.path.setValueFrom(this.object,a))}}),v.prototype=I({__proto__:u.prototype,addPath:function(a,b){if(this.started)throw Error("Cannot add more paths once started.");var b=b instanceof i?b:j(b),c=b?b.getValueFrom(a):void 0;this.observed.push(a,b),this.values.push(c)},start:function(){this.started=!0,this.connect(),this.sync(!0)},getValues:function(){this.observedSet&&this.observedSet.reset();for(var a=!1,b=0;b<this.observed.length;b+=2){var c=this.observed[b+1];if(c){var d=this.observed[b],e=c.getValueFrom(d,this.observedSet),f=this.values[b/2];if(!g(e,f)){if(!a&&!this.valueFn){this.oldValues=this.oldValues||[],this.changeFlags=this.changeFlags||[];for(var h=0;h<this.values.length;h++)this.oldValues[h]=this.values[h],this.changeFlags[h]=!1}this.valueFn||(this.changeFlags[b/2]=!0),this.values[b/2]=e,a=!0}}}return this.observedSet&&this.observedSet.cleanup(),a},check:function(){if(this.getValues()){if(this.valueFn){if(this.value=this.valueFn(this.values),g(this.value,this.oldValue))return!1;this.reportArgs=[this.value,this.oldValue]}else this.reportArgs=[this.values,this.oldValues,this.changeFlags,this.observed];return!0}},sync:function(a){a&&(this.getValues(),this.valueFn&&(this.value=this.valueFn(this.values))),this.valueFn&&(this.oldValue=this.value)},close:function(){if(this.observed){for(var a=0;a<this.observed.length;a+=2){var b=this.observed[a];b&&"function"==typeof b.close&&b.close()}this.observed=void 0,this.values=void 0}p.prototype.close.call(this)}});var $={"new":!0,updated:!0,deleted:!0};u.defineProperty=function(a,b,c){var d=c.object,e=j(c.path),f=w(a,b),g=new u(d,c.path,function(a,b){f&&f("updated",b)});return Object.defineProperty(a,b,{get:function(){return e.getValueFrom(d)},set:function(a){e.setValueFrom(d,a)},configurable:!0}),{close:function(){var c=e.getValueFrom(d);f&&g.deliver(),g.close(),Object.defineProperty(a,b,{value:c,writable:!0,configurable:!0})}}};var _=0,ab=1,bb=2,cb=3;z.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(_):(e.push(ab),d=g),b--,c--):f==h?(e.push(cb),b--,d=h):(e.push(bb),c--,d=i)}else e.push(cb),b--;else e.push(bb),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,0==c-b&&0==f-e)return[];if(b==c){for(var j=y(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[y(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case _:j&&(l.push(j),j=void 0),m++,n++;break;case ab:j||(j=y(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case bb:j||(j=y(m,[],0)),j.addedCount++,m++;break;case cb:j||(j=y(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var db=new z;a.Observer=p,a.Observer.hasObjectObserve=F,a.ArrayObserver=s,a.ArrayObserver.calculateSplices=function(a,b){return db.calculateSplices(a,b)},a.ArraySplice=z,a.ObjectObserver=r,a.PathObserver=u,a.CompoundPathObserver=v,a.Path=i}("undefined"!=typeof global&&global?global:this),"undefined"==typeof WeakMap&&!function(){var a=Object.defineProperty,b=Date.now()%1e9,c=function(){this.name="__st"+(1e9*Math.random()>>>0)+(b++ +"__")};c.prototype={set:function(b,c){var d=b[this.name];d&&d[0]===b?d[1]=c:a(b,this.name,{value:[b,c],writable:!0})},get:function(a){var b;return(b=a[this.name])&&b[0]===a?b[1]:void 0},"delete":function(a){this.set(a,void 0)}},window.WeakMap=c}();var ShadowDOMPolyfill={};!function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a,b){return Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))}),a}function d(a,b){return Object.getOwnPropertyNames(b).forEach(function(c){switch(c){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":return}Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))}),a}function e(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function f(a){var b=a.__proto__||Object.getPrototypeOf(a),c=D.get(b);if(c)return c;var d=f(b),e=s(d);return p(b,e,a),e}function g(a,b){n(a,b,!0)}function h(a,b){n(b,a,!1)}function i(a){return/^on[a-z]+$/.test(a)}function j(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function k(a){return G&&j(a)?new Function("return this.impl."+a):function(){return this.impl[a]}}function l(a){return G&&j(a)?new Function("v","this.impl."+a+" = v"):function(b){this.impl[a]=b}}function m(a){return G&&j(a)?new Function("return this.impl."+a+".apply(this.impl, arguments)"):function(){return this.impl[a].apply(this.impl,arguments)}}function n(b,c,d){Object.getOwnPropertyNames(b).forEach(function(e){if(!(e in c)){J&&b.__lookupGetter__(e);var f;try{f=Object.getOwnPropertyDescriptor(b,e)}catch(g){f=K}var h,j;if(d&&"function"==typeof f.value)return c[e]=m(e),void 0;var n=i(e);h=n?a.getEventHandlerGetter(e):k(e),(f.writable||f.set)&&(j=n?a.getEventHandlerSetter(e):l(e)),Object.defineProperty(c,e,{get:h,set:j,configurable:f.configurable,enumerable:f.enumerable})}})}function o(a,b,c){var e=a.prototype;p(e,b,c),d(b,a)}function p(a,c,d){var e=c.prototype;b(void 0===D.get(a)),D.set(a,c),E.set(e,a),g(a,e),d&&h(e,d)}function q(a,b){return D.get(b.prototype)===a}function r(a){var b=Object.getPrototypeOf(a),c=f(b),d=s(c);return p(b,d,a),d}function s(a){function b(b){a.call(this,b)}return b.prototype=Object.create(a.prototype),b.prototype.constructor=b,b}function t(a){return a instanceof F.EventTarget||a instanceof F.Event||a instanceof F.Range||a instanceof F.DOMImplementation||a instanceof F.CanvasRenderingContext2D||F.WebGLRenderingContext&&a instanceof F.WebGLRenderingContext}function u(a){return a instanceof N||a instanceof M||a instanceof O||a instanceof P||a instanceof L||a instanceof Q||R&&a instanceof R}function v(a){return null===a?null:(b(u(a)),a.polymerWrapper_||(a.polymerWrapper_=new(f(a))(a)))}function w(a){return null===a?null:(b(t(a)),a.impl)}function x(a){return a&&t(a)?w(a):a}function y(a){return a&&!t(a)?v(a):a}function z(a,c){null!==c&&(b(u(a)),b(void 0===c||t(c)),a.polymerWrapper_=c)}function A(a,b,c){Object.defineProperty(a.prototype,b,{get:c,configurable:!0,enumerable:!0})}function B(a,b){A(a,b,function(){return v(this.impl[b])})}function C(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=y(this);return a[b].apply(a,arguments)}})})}var D=new WeakMap,E=new WeakMap,F=Object.create(null),G=!("securityPolicy"in document)||document.securityPolicy.allowsEval;if(G)try{var H=new Function("","return true;");G=H()}catch(I){}Object.getOwnPropertyNames(window);var J=/Firefox/.test(navigator.userAgent),K={get:function(){},set:function(){},configurable:!0,enumerable:!0},L=window.DOMImplementation,M=window.Event,N=window.Node,O=window.Window,P=window.Range,Q=window.CanvasRenderingContext2D,R=window.WebGLRenderingContext;a.assert=b,a.constructorTable=D,a.defineGetter=A,a.defineWrapGetter=B,a.forwardMethodsToWrapper=C,a.isWrapperFor=q,a.mixin=c,a.nativePrototypeTable=E,a.oneOf=e,a.registerObject=r,a.registerWrapper=o,a.rewrap=z,a.unwrap=w,a.unwrapIfNeeded=x,a.wrap=v,a.wrapIfNeeded=y,a.wrappers=F}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof O.ShadowRoot}function c(a){var b=a.localName;return"content"===b||"shadow"===b}function d(a){return!!a.shadowRoot}function e(a){var b;return a.parentNode||(b=a.defaultView)&&N(b)||null}function f(f,g,h){if(h.length)return h.shift();if(b(f))return j(f)||a.getHostForShadowRoot(f);var i=a.eventParentsTable.get(f);if(i){for(var k=1;k<i.length;k++)h[k-1]=i[k];return i[0]}if(g&&c(f)){var l=f.parentNode;if(l&&d(l))for(var m=a.getShadowTrees(l),n=j(g),k=0;k<m.length;k++)if(m[k].contains(n))return n}return e(f)}function g(a){for(var d=[],e=a,g=[],i=[];e;){var j=null;if(c(e)){j=h(d);var k=d[d.length-1]||e;d.push(k)}else d.length||d.push(e);var l=d[d.length-1];g.push({target:l,currentTarget:e}),b(e)&&d.pop(),e=f(e,j,i)}return g}function h(a){for(var b=a.length-1;b>=0;b--)if(!c(a[b]))return a[b];return null}function i(d,e){for(var g=[];d;){for(var i=[],j=e,l=void 0;j;){var n=null;if(i.length){if(c(j)&&(n=h(i),k(l))){var o=i[i.length-1];i.push(o)}}else i.push(j);if(m(j,d))return i[i.length-1];b(j)&&i.pop(),l=j,j=f(j,n,g)}d=b(d)?a.getHostForShadowRoot(d):d.parentNode}}function j(b){return a.insertionParentTable.get(b)}function k(a){return j(a)}function l(a){for(var b;b=a.parentNode;)a=b;return a}function m(a,b){return l(a)===l(b)}function n(b,c){if(b===c)return!0;if(b instanceof O.ShadowRoot){var d=a.getHostForShadowRoot(b);return n(l(d),c)}return!1}function o(){Z++}function p(){Z--}function q(b){if(!Q.get(b)){if(Q.set(b,!0),b instanceof $){if(Z)return}else a.renderAllPending();var c=N(b.target),d=N(b);return r(d,c)}}function r(a,b){var c=g(b);return"load"===a.type&&2===c.length&&c[0].target instanceof O.Document&&c.shift(),Y.set(a,c),s(a,c)&&t(a,c)&&u(a,c),U.set(a,x.NONE),S.set(a,null),a.defaultPrevented}function s(a,b){for(var c,d=b.length-1;d>0;d--){var e=b[d].target,f=b[d].currentTarget;if(e!==f&&(c=x.CAPTURING_PHASE,!v(b[d],a,c)))return!1}return!0}function t(a,b){var c=x.AT_TARGET;return v(b[0],a,c)}function u(a,b){for(var c,d=a.bubbles,e=1;e<b.length;e++){var f=b[e].target,g=b[e].currentTarget;if(f===g)c=x.AT_TARGET;else{if(!d||W.get(a))continue;c=x.BUBBLING_PHASE}if(!v(b[e],a,c))return}}function v(a,b,c){var d=a.target,e=a.currentTarget,f=P.get(e);if(!f)return!0;if("relatedTarget"in b){var g=M(b);if(g.relatedTarget){var h=N(g.relatedTarget),j=i(e,h);if(j===d)return!0;T.set(b,j)}}U.set(b,c);var k=b.type,l=!1;R.set(b,d),S.set(b,e);for(var m=0;m<f.length;m++){var n=f[m];if(n.removed)l=!0;else if(!(n.type!==k||!n.capture&&c===x.CAPTURING_PHASE||n.capture&&c===x.BUBBLING_PHASE))try{if("function"==typeof n.handler?n.handler.call(e,b):n.handler.handleEvent(b),W.get(b))return!1}catch(o){window.onerror?window.onerror(o.message):console.error(o,o.stack)}}if(l){var p=f.slice();f.length=0;for(var m=0;m<p.length;m++)p[m].removed||f.push(p[m])}return!V.get(b)}function w(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function x(a,b){return a instanceof _?(this.impl=a,void 0):N(B(_,"Event",a,b))}function y(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:M(a.relatedTarget)}}):a}function z(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?(this.impl=b,void 0):N(B(d,a,b,c))};return e.prototype=Object.create(b.prototype),c&&K(e.prototype,c),d&&(d.prototype["init"+a]?L(d,e,document.createEvent(a)):L(d,e,new d("temp"))),e}function A(a,b){return function(){arguments[b]=M(arguments[b]);var c=M(this);c[a].apply(c,arguments)}}function B(a,b,c,d){if(jb)return new a(c,y(d));var e=M(document.createEvent(b)),f=ib[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=M(b)),g.push(b)}),e["init"+b].apply(e,g),e}function C(a){return"function"==typeof a?!0:a&&a.handleEvent}function D(a){this.impl=a}function E(b){return b instanceof O.ShadowRoot&&(b=a.getHostForShadowRoot(b)),M(b)}function F(a){J(a,mb)}function G(b,c,d,e){a.renderAllPending();for(var f=N(nb.call(c.impl,d,e)),h=g(f,this),i=0;i<h.length;i++){var j=h[i];if(j.currentTarget===b)return j.target}return null}function H(a){return function(){var b=X.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=X.get(this);d||(d=Object.create(null),X.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var J=a.forwardMethodsToWrapper,K=a.mixin,L=a.registerWrapper,M=a.unwrap,N=a.wrap,O=a.wrappers;new WeakMap;var P=new WeakMap,Q=new WeakMap,R=new WeakMap,S=new WeakMap,T=new WeakMap,U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=0,$=window.MutationEvent;w.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var _=window.Event;x.prototype={get target(){return R.get(this)},get currentTarget(){return S.get(this)},get eventPhase(){return U.get(this)},get path(){var a=new O.NodeList,b=Y.get(this);if(b){for(var c=0,d=b.length-1,e=l(S.get(this)),f=0;d>=f;f++){var g=b[f].currentTarget,h=l(g);n(e,h)&&(f!==d||g instanceof O.Node)&&(a[c++]=g)}a.length=c}return a},stopPropagation:function(){V.set(this,!0)},stopImmediatePropagation:function(){V.set(this,!0),W.set(this,!0)}},L(_,x,document.createEvent("Event"));var ab=z("UIEvent",x),bb=z("CustomEvent",x),cb={get relatedTarget(){return T.get(this)||N(M(this).relatedTarget)}},db=K({initMouseEvent:A("initMouseEvent",14)},cb),eb=K({initFocusEvent:A("initFocusEvent",5)},cb),fb=z("MouseEvent",ab,db),gb=z("FocusEvent",ab,eb),hb=z("MutationEvent",x,{initMutationEvent:A("initMutationEvent",3),get relatedNode(){return N(this.impl.relatedNode)}}),ib=Object.create(null),jb=function(){try{new window.MouseEvent("click")}catch(a){return!1}return!0}();if(!jb){var kb=function(a,b,c){if(c){var d=ib[c];b=K(K({},d),b)}ib[a]=b};kb("Event",{bubbles:!1,cancelable:!1}),kb("CustomEvent",{detail:null},"Event"),kb("UIEvent",{view:null,detail:0},"Event"),kb("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),kb("FocusEvent",{relatedTarget:null},"UIEvent")}var lb=window.EventTarget,mb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;mb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),D.prototype={addEventListener:function(a,b,c){if(C(b)){var d=new w(a,b,c),e=P.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],P.set(this,e);e.push(d);var g=E(this);g.addEventListener_(a,q,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=P.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=E(this);h.removeEventListener_(a,q,!0)}}},dispatchEvent:function(a){var b=E(this),c=M(a);return Q.set(c,!1),b.dispatchEvent_(c)}},lb&&L(lb,D);var nb=document.elementFromPoint;a.adjustRelatedTarget=i,a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.muteMutationEvents=o,a.unmuteMutationEvents=p,a.wrapEventTargetMethods=F,a.wrappers.CustomEvent=bb,a.wrappers.Event=x,a.wrappers.EventTarget=D,a.wrappers.FocusEvent=gb,a.wrappers.MouseEvent=fb,a.wrappers.MutationEvent=hb,a.wrappers.UIEvent=ab}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,{enumerable:!1})}function c(){this.length=0,b(this,"length")}function d(a){if(null==a)return a;for(var b=new c,d=0,e=a.length;e>d;d++)b[d]=f(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(this.impl[b].apply(this.impl,arguments))}}var f=a.wrap;c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){o(a instanceof k)}function c(a,b,c,d){if(!(a instanceof DocumentFragment))return a.parentNode&&a.parentNode.removeChild(a),a.parentNode_=b,a.previousSibling_=c,a.nextSibling_=d,c&&(c.nextSibling_=a),d&&(d.previousSibling_=a),[a];for(var e,f=[];e=a.firstChild;)a.removeChild(e),f.push(e),e.parentNode_=b;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||c,f[g].nextSibling_=f[g+1]||d;return c&&(c.nextSibling_=f[0]),d&&(d.previousSibling_=f[f.length-1]),f}function d(a){if(a instanceof DocumentFragment){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}return[a]}function e(a){for(var b=0;b<a.length;b++)a[b].nodeWasAdded_()}function f(a,b){var c=a.nodeType===k.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function g(b,c){if(c.length){var d=b.ownerDocument;if(d!==c[0].ownerDocument)for(var e=0;e<c.length;e++)a.adoptNodeNoRemove(c[e],d)}}function h(a,b){g(a,b);var c=b.length;if(1===c)return r(b[0]);for(var d=r(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(r(b[e]));return d}function i(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){o(b.parentNode===a);var c=b.nextSibling,d=r(b),e=d.parentNode;e&&y.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=r(a),g=f.firstChild;g;)c=g.nextSibling,y.call(f,g),g=c}function j(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function k(a){o(a instanceof u),l.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0}var l=a.wrappers.EventTarget,m=a.wrappers.NodeList,n=a.defineWrapGetter,o=a.assert,p=a.mixin,q=a.registerWrapper,r=a.unwrap,s=a.wrap,t=a.wrapIfNeeded,u=window.Node,v=u.prototype.appendChild,w=u.prototype.insertBefore,x=u.prototype.replaceChild,y=u.prototype.removeChild,z=u.prototype.compareDocumentPosition;k.prototype=Object.create(l.prototype),p(k.prototype,{appendChild:function(a){b(a);var g;if(this.invalidateShadowRenderer()||j(a)){var i=this.lastChild,k=null;g=c(a,this,i,k),this.lastChild_=g[g.length-1],i||(this.firstChild_=g[0]),v.call(this.impl,h(this,g))}else g=d(a),f(this,a),v.call(this.impl,r(a));return e(g),a},insertBefore:function(a,i){if(!i)return this.appendChild(a);b(a),b(i),o(i.parentNode===this);var k;if(this.invalidateShadowRenderer()||j(a)){var l=i.previousSibling,m=i;k=c(a,this,l,m),this.firstChild===i&&(this.firstChild_=k[0]);var n=r(i),p=n.parentNode;p?w.call(p,h(this,k),n):g(this,k)}else k=d(a),f(this,a),w.call(this.impl,r(a),r(i));return e(k),a},removeChild:function(a){if(b(a),a.parentNode!==this)throw new Error("NotFoundError");var c=r(a);if(this.invalidateShadowRenderer()){var d=this.firstChild,e=this.lastChild,f=a.nextSibling,g=a.previousSibling,h=c.parentNode;h&&y.call(h,c),d===a&&(this.firstChild_=f),e===a&&(this.lastChild_=g),g&&(g.nextSibling_=f),f&&(f.previousSibling_=g),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else y.call(this.impl,c);return a},replaceChild:function(a,g){if(b(a),b(g),g.parentNode!==this)throw new Error("NotFoundError");var i,k=r(g);if(this.invalidateShadowRenderer()||j(a)){var l=g.previousSibling,m=g.nextSibling;m===a&&(m=a.nextSibling),i=c(a,this,l,m),this.firstChild===g&&(this.firstChild_=i[0]),this.lastChild===g&&(this.lastChild_=i[i.length-1]),g.previousSibling_=g.nextSibling_=g.parentNode_=void 0,k.parentNode&&x.call(k.parentNode,h(this,i),k)}else i=d(a),f(this,a),x.call(this.impl,r(a),k);return e(i),g},nodeWasAdded_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeWasAdded_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:s(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:s(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:s(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:s(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:s(this.impl.previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==k.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)a+=b.textContent;return a},set textContent(a){if(this.invalidateShadowRenderer()){if(i(this),""!==a){var b=this.impl.ownerDocument.createTextNode(a);this.appendChild(b)}}else this.impl.textContent=a},get childNodes(){for(var a=new m,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){if(!this.invalidateShadowRenderer())return s(this.impl.cloneNode(a));var b=s(this.impl.cloneNode(!1));if(a)for(var c=this.firstChild;c;c=c.nextSibling)b.appendChild(c.cloneNode(!0));return b},contains:function(a){if(!a)return!1;if(a=t(a),a===this)return!0;var b=a.parentNode;return b?this.contains(b):!1},compareDocumentPosition:function(a){return z.call(this.impl,r(a))}}),n(k,"ownerDocument"),q(u,k,document.createDocumentFragment()),delete k.prototype.querySelector,delete k.prototype.querySelectorAll,k.prototype=p(Object.create(l.prototype),k.prototype),a.wrappers.Node=k}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a,c){for(var d,e=a.firstElementChild;e;){if(e.matches(c))return e;
-if(d=b(e,c))return d;e=e.nextElementSibling}return null}function c(a,b,d){for(var e=a.firstElementChild;e;)e.matches(b)&&(d[d.length++]=e),c(e,b,d),e=e.nextElementSibling;return d}var d={querySelector:function(a){return b(this,a)},querySelectorAll:function(a){return c(this,a,new NodeList)}},e={getElementsByTagName:function(a){return this.querySelectorAll(a)},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){if("*"===a)return this.getElementsByTagName(b);for(var c=new NodeList,d=this.getElementsByTagName(b),e=0,f=0;e<d.length;e++)d[e].namespaceURI===a&&(c[f++]=d[e]);return c.length=f,c}};a.GetElementsByInterface=e,a.SelectorsInterface=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.previousSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.mixin,f=a.registerWrapper,g=window.CharacterData;b.prototype=Object.create(d.prototype),e(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a}}),e(b.prototype,c),f(g,b,document.createTextNode("")),a.wrappers.CharacterData=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(b,c){var d=b.parentNode;if(d&&d.shadowRoot){var e=a.getRendererForHost(d);e.dependsOnAttribute(c)&&e.invalidate()}}function c(a){g.call(this,a)}function d(a,c,d){var e=d||c;Object.defineProperty(a,c,{get:function(){return this.impl[c]},set:function(a){this.impl[c]=a,b(this,e)},configurable:!0,enumerable:!0})}var e=a.ChildNodeInterface,f=a.GetElementsByInterface,g=a.wrappers.Node,h=a.ParentNodeInterface,i=a.SelectorsInterface;a.addWrapNodeListMethod;var j=a.mixin,k=a.oneOf,l=a.registerWrapper,m=a.wrappers,n=window.Element,o=k(n.prototype,["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"]),p=n.prototype[o];c.prototype=Object.create(g.prototype),j(c.prototype,{createShadowRoot:function(){var b=new m.ShadowRoot(this);this.impl.polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return this.impl.polymerShadowRoot_||null},setAttribute:function(a,c){this.impl.setAttribute(a,c),b(this,a)},removeAttribute:function(a){this.impl.removeAttribute(a),b(this,a)},matches:function(a){return p.call(this.impl,a)}}),c.prototype[o]=function(a){return this.matches(a)},n.prototype.webkitCreateShadowRoot&&(c.prototype.webkitCreateShadowRoot=c.prototype.createShadowRoot),d(c.prototype,"id"),d(c.prototype,"className","class"),j(c.prototype,e),j(c.prototype,f),j(c.prototype,h),j(c.prototype,i),l(n,c),a.matchesName=o,a.wrappers.Element=c}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case'"':return"&quot;"}}function c(a){return a.replace(r,b)}function d(a){switch(a.nodeType){case Node.ELEMENT_NODE:for(var b,d=a.tagName.toLowerCase(),f="<"+d,g=a.attributes,h=0;b=g[h];h++)f+=" "+b.name+'="'+c(b.value)+'"';return f+=">",s[d]?f:f+e(a)+"</"+d+">";case Node.TEXT_NODE:return c(a.nodeValue);case Node.COMMENT_NODE:return"<!--"+c(a.nodeValue)+"-->";default:throw console.error(a),new Error("not implemented")}}function e(a){for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=d(c);return b}function f(a,b,c){var d=c||"div";a.textContent="";var e=p(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(q(f))}function g(a){l.call(this,a)}function h(b){return function(){return a.renderAllPending(),this.impl[b]}}function i(a){m(g,a,h(a))}function j(b){Object.defineProperty(g.prototype,b,{get:h(b),set:function(c){a.renderAllPending(),this.impl[b]=c},configurable:!0,enumerable:!0})}function k(b){Object.defineProperty(g.prototype,b,{value:function(){return a.renderAllPending(),this.impl[b].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var l=a.wrappers.Element,m=a.defineGetter,n=a.mixin,o=a.registerWrapper,p=a.unwrap,q=a.wrap,r=/&|<|"/g,s={area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},t=window.HTMLElement;g.prototype=Object.create(l.prototype),n(g.prototype,{get innerHTML(){return e(this)},set innerHTML(a){this.invalidateShadowRenderer()?f(this,a,this.tagName):this.impl.innerHTML=a},get outerHTML(){return d(this)},set outerHTML(a){var b=this.parentNode;b&&(b.invalidateShadowRenderer(),this.impl.outerHTML=a)}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(i),["scrollLeft","scrollTop"].forEach(j),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(k),o(t,g,document.createElement("b")),a.wrappers.HTMLElement=g,a.getInnerHTML=e,a.setInnerHTML=f}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrap,g=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=this.impl.getContext.apply(this.impl,arguments);return a&&f(a)}}),e(g,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));void 0!==a&&(e.width=a),void 0!==b&&(e.height=b),d.call(this,e),g(e,this)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{}),f&&e(f,b),a.wrappers.HTMLShadowElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=o.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);o.set(a,b)}return b}function c(a){var c,d=b(a.ownerDocument),e=l(d.createDocumentFragment());for(h();c=a.firstChild;)e.appendChild(c);return k(),e}function d(a){if(e.call(this,a),!p){var b=c(a);n.set(this,m(b))}}var e=a.wrappers.HTMLElement,f=a.getInnerHTML,g=a.mixin,h=a.muteMutationEvents,i=a.registerWrapper,j=a.setInnerHTML,k=a.unmuteMutationEvents,l=a.unwrap,m=a.wrap,n=new WeakMap,o=new WeakMap,p=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),g(d.prototype,{get content(){return p?m(this.impl.content):n.get(this)},get innerHTML(){return f(this.content)},set innerHTML(a){j(this.content,a)}}),p&&i(p,d),a.wrappers.HTMLTemplateElement=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement;a.mixin;var g=a.registerWrapper,h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.unwrapIfNeeded,g=a.wrap,h=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return g(this.impl.canvas)},drawImage:function(){arguments[0]=f(arguments[0]),this.impl.drawImage.apply(this.impl,arguments)},createPattern:function(){return arguments[0]=e(arguments[0]),this.impl.createPattern.apply(this.impl,arguments)}}),d(h,b),a.wrappers.CanvasRenderingContext2D=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrapIfNeeded,f=a.wrap,g=window.WebGLRenderingContext;g&&(c(b.prototype,{get canvas(){return f(this.impl.canvas)},texImage2D:function(){arguments[5]=e(arguments[5]),this.impl.texImage2D.apply(this.impl,arguments)},texSubImage2D:function(){arguments[6]=e(arguments[6]),this.impl.texSubImage2D.apply(this.impl,arguments)}}),d(g,b),a.wrappers.WebGLRenderingContext=b)}(this.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createTextNode("")),i=f(document.createComment(""));a.wrappers.Comment=i,a.wrappers.DocumentFragment=g,a.wrappers.Text=h}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=i(a.impl.ownerDocument.createDocumentFragment());c.call(this,b),g(b,this);var d=a.shadowRoot;k.set(this,d),j.set(this,a)}var c=a.wrappers.DocumentFragment,d=a.elementFromPoint,e=a.getInnerHTML,f=a.mixin,g=a.rewrap,h=a.setInnerHTML,i=a.unwrap,j=new WeakMap,k=new WeakMap;b.prototype=Object.create(c.prototype),f(b.prototype,{get innerHTML(){return e(this)},set innerHTML(a){h(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return k.get(this)||null},invalidateShadowRenderer:function(){return j.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return d(this,this.ownerDocument,a,b)},getElementById:function(a){return this.querySelector("#"+a)}}),a.wrappers.ShadowRoot=b,a.getHostForShadowRoot=function(a){return j.get(a)}}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a,c,e){var f=G(a),g=G(c),h=e?G(e):null;if(d(c),b(c),e)a.firstChild===e&&(a.firstChild_=e),e.previousSibling_=e.previousSibling;else{a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var i=H(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=G(a),d=c.parentNode;if(d){var e=H(d);b(a),a.previousSibling&&(a.previousSibling.nextSibling_=a),a.nextSibling&&(a.nextSibling.previousSibling_=a),e.lastChild===a&&(e.lastChild_=a),e.firstChild===a&&(e.firstChild_=a),d.removeChild(c)}}function e(a,b){g(b).push(a),x(a,b);var c=J.get(a);c||J.set(a,c=[]),c.push(b)}function f(a){I.set(a,[])}function g(a){return I.get(a)}function h(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function i(a,b,c){for(var d=a.firstChild;d;d=d.nextSibling)if(b(d)){if(c(d)===!1)return}else i(d,b,c)}function j(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof y))return!1;if(!M.test(c))return!1;if(":"===c[0]&&!N.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function k(){for(var a=0;a<P.length;a++)P[a].render();P=[]}function l(){F=null,k()}function m(a){var b=L.get(a);return b||(b=new q(a),L.set(a,b)),b}function n(a){for(;a;a=a.parentNode)if(a instanceof C)return a;return null}function o(a){return m(D(a))}function p(a){this.skip=!1,this.node=a,this.childNodes=[]}function q(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function r(a){return a instanceof z}function s(a){return a instanceof z}function t(a){return a instanceof A}function u(a){return a instanceof A}function v(a){return a.shadowRoot}function w(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}function x(a,b){K.set(a,b)}var y=a.wrappers.Element,z=a.wrappers.HTMLContentElement,A=a.wrappers.HTMLShadowElement,B=a.wrappers.Node,C=a.wrappers.ShadowRoot;a.assert;var D=a.getHostForShadowRoot;a.mixin,a.muteMutationEvents;var E=a.oneOf;a.unmuteMutationEvents;var F,G=a.unwrap,H=a.wrap,I=new WeakMap,J=new WeakMap,K=new WeakMap,L=new WeakMap,M=/^[*.:#[a-zA-Z_|]/,N=new RegExp("^:("+["link","visited","target","enabled","disabled","checked","indeterminate","nth-child","nth-last-child","nth-of-type","nth-last-of-type","first-child","last-child","first-of-type","last-of-type","only-of-type"].join("|")+")"),O=E(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),P=[],Q=new ArraySplice;Q.equals=function(a,b){return G(a.node)===b},p.prototype={append:function(a){var b=new p(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=h(G(b)),g=a||new WeakMap,i=Q.calculateSplices(e,f),j=0,k=0,l=0,m=0;m<i.length;m++){for(var n=i[m];l<n.index;l++)k++,e[j++].sync(g);for(var o=n.removed.length,p=0;o>p;p++){var q=H(f[k++]);g.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&H(f[k]),p=0;r>p;p++){var t=e[j++],u=t.node;c(b,u,s),g.set(u,!0),t.sync(g)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(g)}}},q.prototype={render:function(a){if(this.dirty){this.invalidateAttributes(),this.treeComposition();var b=this.host,c=b.shadowRoot;this.associateNode(b);for(var d=!e,e=a||new p(b),f=c.firstChild;f;f=f.nextSibling)this.renderNode(c,e,f,!1);d&&e.sync(),this.dirty=!1}},invalidate:function(){if(!this.dirty){if(this.dirty=!0,P.push(this),F)return;F=window[O](l,0)}},renderNode:function(a,b,c,d){if(v(c)){b=b.append(c);var e=m(c);e.dirty=!0,e.render(b)}else r(c)?this.renderInsertionPoint(a,b,c,d):t(c)?this.renderShadowInsertionPoint(a,b,c):this.renderAsAnyDomTree(a,b,c,d)},renderAsAnyDomTree:function(a,b,c,d){if(b=b.append(c),v(c)){var e=m(c);b.skip=!e.dirty,e.render(b)}else for(var f=c.firstChild;f;f=f.nextSibling)this.renderNode(a,b,f,d)},renderInsertionPoint:function(a,b,c,d){var e=g(c);if(e.length){this.associateNode(c);for(var f=0;f<e.length;f++){var h=e[f];r(h)&&d?this.renderInsertionPoint(a,b,h,d):this.renderAsAnyDomTree(a,b,h,d)}}else this.renderFallbackContent(a,b,c);this.associateNode(c.parentNode)},renderShadowInsertionPoint:function(a,b,c){var d=a.olderShadowRoot;if(d){x(d,c),this.associateNode(c.parentNode);for(var e=d.firstChild;e;e=e.nextSibling)this.renderNode(d,b,e,!0)}else this.renderFallbackContent(a,b,c)},renderFallbackContent:function(a,b,c){this.associateNode(c),this.associateNode(c.parentNode);for(var d=c.firstChild;d;d=d.nextSibling)this.renderAsAnyDomTree(a,b,d,!1)},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},distribute:function(a,b){var c=this;i(a,s,function(a){f(a),c.updateDependentAttributes(a.getAttribute("select"));for(var d=0;d<b.length;d++){var g=b[d];void 0!==g&&j(g,a)&&(e(g,a),b[d]=void 0)}})},treeComposition:function(){for(var a=this.host,b=a.shadowRoot,c=[],d=a.firstChild;d;d=d.nextSibling)if(r(d)){var e=g(d);e&&e.length||(e=h(d)),c.push.apply(c,e)}else c.push(d);for(var f,j;b;){if(f=void 0,i(b,u,function(a){return f=a,!1}),j=f,this.distribute(b,c),j){var k=b.olderShadowRoot;if(k){b=k,x(b,j);continue}break}break}},associateNode:function(a){a.impl.polymerShadowRenderer_=this}},B.prototype.invalidateShadowRenderer=function(){var a=this.impl.polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},z.prototype.getDistributedNodes=function(){return k(),g(this)},A.prototype.nodeWasAdded_=z.prototype.nodeWasAdded_=function(){this.invalidateShadowRenderer();var a,b=n(this);b&&(a=o(b)),this.impl.polymerShadowRenderer_=a,a&&a.invalidate()},a.eventParentsTable=J,a.getRendererForHost=m,a.getShadowTrees=w,a.insertionParentTable=K,a.renderAllPending=k,a.visual={insertBefore:c,remove:d}}(this.ShadowDOMPolyfill),function(a){"use strict";function b(b){if(window[b]){d(!a.wrappers[b]);var i=function(a){c.call(this,a)};i.prototype=Object.create(c.prototype),e(i.prototype,{get form(){return h(g(this).form)}}),f(window[b],i,document.createElement(b.slice(4,-7))),a.wrappers[b]=i}}var c=a.wrappers.HTMLElement,d=a.assert,e=a.mixin,f=a.registerWrapper,g=a.unwrap,h=a.wrap,i=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOptionElement","HTMLOutputElement","HTMLSelectElement","HTMLTextAreaElement"];i.forEach(b)}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a)}function c(a){var c=document[a];b.prototype[a]=function(){return v(c.apply(this.impl,arguments))}}function d(a,b){y.call(b.impl,u(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof n&&f(a,b);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}function f(a,b){var c=a.olderShadowRoot;c&&b.adoptNode(c)}function g(a){this.impl=a}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return v(c.apply(this.impl,arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(this.impl,arguments)}}var j=a.GetElementsByInterface,k=a.wrappers.Node,l=a.ParentNodeInterface,m=a.SelectorsInterface,n=a.wrappers.ShadowRoot,o=a.defineWrapGetter,p=a.elementFromPoint,q=a.forwardMethodsToWrapper,r=a.matchesName,s=a.mixin,t=a.registerWrapper,u=a.unwrap,v=a.wrap,w=a.wrapEventTargetMethods;a.wrapNodeList;var x=new WeakMap;b.prototype=Object.create(k.prototype),o(b,"documentElement"),o(b,"body"),o(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var y=document.adoptNode;if(s(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return p(this,this,a,b)}}),document.register){var z=document.register;b.prototype.register=function(b,c){function d(a){return a?(this.impl=a,void 0):document.createElement(b)}var e=c.prototype;if(a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var f,g=Object.getPrototypeOf(e),h=[];g&&!(f=a.nativePrototypeTable.get(g));)h.push(g),g=Object.getPrototypeOf(g);if(!f)throw new Error("NotSupportedError");for(var i=Object.create(f),j=h.length-1;j>=0;j--)i=Object.create(i);return["createdCallback","enteredViewCallback","leftViewCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(i[a]=function(){b.apply(v(this),arguments)})}),z.call(u(this),b,{prototype:i}),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(i,d),a.nativePrototypeTable.set(e,i),d},q([window.HTMLDocument||window.Document],["register"])}q([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild",r]),q([window.HTMLDocument||window.Document],["adoptNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById"]),s(b.prototype,j),s(b.prototype,l),s(b.prototype,m),s(b.prototype,{get implementation(){var a=x.get(this);return a?a:(a=new g(u(this).implementation),x.set(this,a),a)}}),t(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&t(window.HTMLDocument,b),w([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),t(window.DOMImplementation,g),q([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.unwrapIfNeeded,h=a.wrap,i=a.renderAllPending,j=window.Window;b.prototype=Object.create(c.prototype);var k=window.getComputedStyle;j.prototype.getComputedStyle=function(a,b){return i(),k.call(this||window,g(a),b)},["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){j.prototype[a]=function(){var b=h(this||window);return b[a].apply(b,arguments)}}),d(b.prototype,{getComputedStyle:function(a,b){return k.call(f(this),g(a),b)}}),e(j,b),a.wrappers.Window=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}function c(a){return new b(a)}function d(a){return a.map(c)}function e(a){var b=this;this.impl=new k(function(c){a.call(b,d(c),b)})}var f=a.defineGetter,g=a.defineWrapGetter,h=a.registerWrapper,i=a.unwrapIfNeeded,j=a.wrapNodeList;a.wrappers;var k=window.MutationObserver||window.WebKitMutationObserver;if(k){var l=window.MutationRecord;b.prototype={get addedNodes(){return j(this.impl.addedNodes)},get removedNodes(){return j(this.impl.removedNodes)}},["target","previousSibling","nextSibling"].forEach(function(a){g(b,a)}),["type","attributeName","attributeNamespace","oldValue"].forEach(function(a){f(b,a,function(){return this.impl[a]})}),l&&h(l,b),window.Node,e.prototype={observe:function(a,b){this.impl.observe(i(a),b)},disconnect:function(){this.impl.disconnect()},takeRecords:function(){return d(this.impl.takeRecords())}},a.wrappers.MutationObserver=e,a.wrappers.MutationRecord=b}}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap,g=window.Range;b.prototype={get startContainer(){return f(this.impl.startContainer)},get endContainer(){return f(this.impl.endContainer)},get commonAncestorContainer(){return f(this.impl.commonAncestorContainer)},setStart:function(a,b){this.impl.setStart(e(a),b)},setEnd:function(a,b){this.impl.setEnd(e(a),b)},setStartBefore:function(a){this.impl.setStartBefore(e(a))},setStartAfter:function(a){this.impl.setStartAfter(e(a))},setEndBefore:function(a){this.impl.setEndBefore(e(a))},setEndAfter:function(a){this.impl.setEndAfter(e(a))},selectNode:function(a){this.impl.selectNode(e(a))},selectNodeContents:function(a){this.impl.selectNodeContents(e(a))},compareBoundaryPoints:function(a,b){return this.impl.compareBoundaryPoints(a,d(b))},extractContents:function(){return f(this.impl.extractContents())},cloneContents:function(){return f(this.impl.cloneContents())},insertNode:function(a){this.impl.insertNode(e(a))},surroundContents:function(a){this.impl.surroundContents(e(a))},cloneRange:function(){return f(this.impl.cloneRange())},isPointInRange:function(a,b){return this.impl.isPointInRange(e(a),b)},comparePoint:function(a,b){return this.impl.comparePoint(e(a),b)},intersectsNode:function(a){return this.impl.intersectsNode(e(a))}},g.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return f(this.impl.createContextualFragment(a))}),c(window.Range,b),a.wrappers.Range=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}a.isWrapperFor;var c={a:"HTMLAnchorElement",applet:"HTMLAppletElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",br:"HTMLBRElement",base:"HTMLBaseElement",body:"HTMLBodyElement",button:"HTMLButtonElement",dl:"HTMLDListElement",datalist:"HTMLDataListElement",data:"HTMLDataElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",hr:"HTMLHRElement",head:"HTMLHeadElement",h1:"HTMLHeadingElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",input:"HTMLInputElement",li:"HTMLLIElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",del:"HTMLModElement",ol:"HTMLOListElement",object:"HTMLObjectElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",time:"HTMLTimeElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",table:"HTMLTableElement",tr:"HTMLTableRowElement",thead:"HTMLTableSectionElement",tbody:"HTMLTableSectionElement",textarea:"HTMLTextAreaElement",track:"HTMLTrackElement",title:"HTMLTitleElement",ul:"HTMLUListElement",video:"HTMLVideoElement"};Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]}),a.knownElements=c}(this.ShadowDOMPolyfill),function(){var a=window.ShadowDOMPolyfill;a.wrap,Object.defineProperties(HTMLElement.prototype,{webkitShadowRoot:{get:function(){return this.shadowRoot}}}),HTMLElement.prototype.webkitCreateShadowRoot=HTMLElement.prototype.createShadowRoot,window.dartExperimentalFixupGetTag=function(b){function c(a){if(a instanceof d)return"NodeList";if(a instanceof e)return"ShadowRoot";if(window.MutationRecord&&a instanceof MutationRecord)return"MutationRecord";if(window.MutationObserver&&a instanceof MutationObserver)return"MutationObserver";if(a instanceof HTMLTemplateElement)return"HTMLTemplateElement";var c=f(a);if(a!==c){var g=a.constructor;if(g===c.constructor){var h=g._ShadowDOMPolyfill$cacheTag_;return h||(h=Object.prototype.toString.call(c),h=h.substring(8,h.length-1),g._ShadowDOMPolyfill$cacheTag_=h),h}a=c}return b(a)}var d=a.wrappers.NodeList,e=a.wrappers.ShadowRoot,f=a.unwrapIfNeeded;return c}}();var Platform={};!function(a){function b(a,b){var c="";return Array.prototype.forEach.call(a,function(a){c+=a.textContent+"\n\n"}),b||(c=c.replace(n,"")),c}function c(a){var b=document.createElement("style");return b.textContent=a,b}function d(a){var b=c(a);document.head.appendChild(b);var d=b.sheet.cssRules;return b.parentNode.removeChild(b),d}function e(a){for(var b=0,c=[];b<a.length;b++)c.push(a[b].cssText);return c.join("\n\n")}function f(a){a&&g().appendChild(document.createTextNode(a))}function g(){return h||(h=document.createElement("style"),h.setAttribute("ShadowCSSShim","")),h}var h,i={strictStyling:!1,registry:{},shimStyling:function(a,b,d){var e=this.isTypeExtension(d),g=this.registerDefinition(a,b,d);this.strictStyling&&this.applyScopeToContent(a,b),this.insertPolyfillDirectives(g.rootStyles),this.insertPolyfillRules(g.rootStyles);var h=this.stylesToShimmedCssText(g.scopeStyles,b,e);h+=this.extractPolyfillUnscopedRules(g.rootStyles),g.shimmedStyle=c(h),a&&(a.shimmedStyle=g.shimmedStyle);for(var i,j=0,k=g.rootStyles.length;k>j&&(i=g.rootStyles[j]);j++)i.parentNode.removeChild(i);f(h)},registerDefinition:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=a?a.querySelectorAll("style"):[];e=e?Array.prototype.slice.call(e,0):[],d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return!f||a&&!a.querySelector("shadow")||(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},isTypeExtension:function(a){return a&&a.indexOf("-")<0},applyScopeToContent:function(a,b){a&&(Array.prototype.forEach.call(a.querySelectorAll("*"),function(a){a.setAttribute(b,"")}),Array.prototype.forEach.call(a.querySelectorAll("template"),function(a){this.applyScopeToContent(a.content,b)},this))},insertPolyfillDirectives:function(a){a&&Array.prototype.forEach.call(a,function(a){a.textContent=this.insertPolyfillDirectivesInCssText(a.textContent)},this)},insertPolyfillDirectivesInCssText:function(a){return a.replace(o,function(a,b){return b.slice(0,-2)+"{"})},insertPolyfillRules:function(a){a&&Array.prototype.forEach.call(a,function(a){a.textContent=this.insertPolyfillRulesInCssText(a.textContent)},this)},insertPolyfillRulesInCssText:function(a){return a.replace(p,function(a,b){return b.slice(0,-1)})},extractPolyfillUnscopedRules:function(a){var b="";return a&&Array.prototype.forEach.call(a,function(a){b+=this.extractPolyfillUnscopedRulesFromCssText(a.textContent)+"\n\n"},this),b},extractPolyfillUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";return c},stylesToShimmedCssText:function(a,b,c){return this.shimAtHost(a,b,c)+this.shimScoping(a,b,c)},shimAtHost:function(a,b,c){return a?this.convertAtHostStyles(a,b,c):void 0},convertAtHostStyles:function(a,c,f){var g=b(a),h=this;return g=g.replace(j,function(a,b){return h.scopeHostCss(b,c,f)}),g=e(this.findAtHostRules(d(g),new RegExp("^"+c+u,"m")))},scopeHostCss:function(a,b,c){var d=this;return a.replace(k,function(a,e,f){return d.scopeHostSelector(e,b,c)+" "+f+"\n	"})},scopeHostSelector:function(a,b,c){var d=[],e=a.split(","),f="[is="+b+"]";return e.forEach(function(a){a=a.trim(),a.match(l)?a=a.replace(l,c?f+"$1$3":b+"$1$3"):a.match(m)&&(a=c?f+a:b+a),d.push(a)},this),d.join(", ")},findAtHostRules:function(a,b){return Array.prototype.filter.call(a,this.isHostRule.bind(this,b))},isHostRule:function(a,b){return b.selectorText&&b.selectorText.match(a)||b.cssRules&&this.findAtHostRules(b.cssRules,a).length||b.type==CSSRule.WEBKIT_KEYFRAMES_RULE},shimScoping:function(a,b,c){return a?this.convertScopedStyles(a,b,c):void 0},convertScopedStyles:function(a,c,e){var f=b(a).replace(j,"");f=this.insertPolyfillHostInCssText(f),f=this.convertColonHost(f),f=this.convertPseudos(f),f=this.convertParts(f),f=this.convertCombinators(f);var g=d(f);return f=this.scopeRules(g,c,e)},convertPseudos:function(a){return a.replace(r," [pseudo=$1]")},convertParts:function(a){return a.replace(s," [part=$1]")},convertColonHost:function(a){return a.replace(t,function(a,b,c,d){return c?y+c+d+", "+c+" "+b+d:b+d})},convertCombinators:function(a){return a.replace("^^"," ").replace("^"," ")},scopeRules:function(a,b,c){var d="";return Array.prototype.forEach.call(a,function(a){a.selectorText&&a.style&&a.style.cssText?(d+=this.scopeSelector(a.selectorText,b,c,this.strictStyling)+" {\n	",d+=this.propertiesFromRule(a)+"\n}\n\n"):a.media?(d+="@media "+a.media.mediaText+" {\n",d+=this.scopeRules(a.cssRules,b),d+="\n}\n\n"):a.cssText&&(d+=a.cssText+"\n\n")},this),d},scopeSelector:function(a,b,c,d){var e=[],f=a.split(",");return f.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b,c)&&(a=d?this.applyStrictSelectorScope(a,b):this.applySimpleSelectorScope(a,b,c)),e.push(a)},this),e.join(", ")},selectorNeedsScoping:function(a,b,c){var d=c?b:"\\[is="+b+"\\]",e=new RegExp("^("+d+")"+u,"m");return!a.match(e)},applySimpleSelectorScope:function(a,b,c){var d=c?"[is="+b+"]":b;return a.match(z)?(a=a.replace(y,d),a.replace(z,d+" ")):d+" "+a},applyStrictSelectorScope:function(a,b){var c=[" ",">","+","~"],d=a,e="["+b+"]";return c.forEach(function(a){var b=d.split(a);d=b.map(function(a){var b=a.trim().replace(z,"");return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},insertPolyfillHostInCssText:function(a){return a.replace(v,x).replace(w,x)
-},propertiesFromRule:function(a){var b=a.style.cssText;return a.style.content&&!a.style.content.match(/['"]+/)&&(b="content: '"+a.style.content+"';\n"+a.style.cssText.replace(/content:[^;]*;/g,"")),b}},j=/@host[^{]*{(([^}]*?{[^{]*?}[\s\S]*?)+)}/gim,k=/([^{]*)({[\s\S]*?})/gim,l=/(.*)((?:\*)|(?:\:scope))(.*)/,m=/^[.\[:]/,n=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,o=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,p=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/::(x-[^\s{,(]*)/gim,s=/::part\(([^)]*)\)/gim,t=/(-host)(?:\(([^)]*)\))?([^,{]*)/gim,u="([>\\s~+[.,{:][\\s\\S]*)?$",v=/@host/gim,w=/\:host/gim,x="-host",y="-host-no-combinator",z=/-host/gim;if(window.ShadowDOMPolyfill){f("style { display: none !important; }\n");var A=document.querySelector("head");A.insertBefore(g(),A.childNodes[0])}a.ShadowCSS=i}(window.Platform)}
\ No newline at end of file
+if(!HTMLElement.prototype.createShadowRoot||window.__forceShadowDomPolyfill){!function(){Element.prototype.webkitCreateShadowRoot&&(Element.prototype.webkitCreateShadowRoot=function(){return window.ShadowDOMPolyfill.wrapIfNeeded(this).createShadowRoot()})}(),function(a){"use strict";function b(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={};if(Object.observe(c,a),c.id=1,c.id=2,delete c.id,Object.deliverChangeRecords(a),3!==b.length)return!1;if("new"==b[0].type&&"updated"==b[1].type&&"deleted"==b[2].type)F="new",G="updated",H="reconfigured",I="deleted";else if("add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type)return console.error("Unexpected change record names for Object.observe. Using dirty-checking instead"),!1;return Object.unobserve(c,a),c=[0],Array.observe(c,a),c[1]=1,c.length=0,Object.deliverChangeRecords(a),2!=b.length?!1:b[0].type!=J||b[1].type!=J?!1:(Array.unobserve(c,a),!0)}function c(){if(a.document&&"securityPolicy"in a.document&&!a.document.securityPolicy.allowsEval)return!1;try{var b=new Function("","return true;");return b()}catch(c){return!1}}function d(a){return+a===a>>>0}function e(a){return+a}function f(a){return a===Object(a)}function g(a,b){return a===b?0!==a||1/a===1/b:M(a)&&M(b)?!0:a!==a&&b!==b}function h(a){return"string"!=typeof a?!1:(a=a.trim(),""==a?!0:"."==a[0]?!1:U.test(a))}function i(a,b){if(b!==V)throw Error("Use Path.get to retrieve path objects");return""==a.trim()?this:d(a)?(this.push(a),this):(a.split(/\s*\.\s*/).filter(function(a){return a}).forEach(function(a){this.push(a)},this),L&&!K&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn()),void 0)}function j(a){if(a instanceof i)return a;null==a&&(a=""),"string"!=typeof a&&(a=String(a));var b=W[a];if(b)return b;if(!h(a))return X;var b=new i(a,V);return W[a]=b,b}function k(b){for(var c=0;Y>c&&b.check();)b.report(),c++;a.testingExposeCycleCount&&(a.dirtyCheckCycleCount=c)}function l(a){for(var b in a)return!1;return!0}function m(a){return l(a.added)&&l(a.removed)&&l(a.changed)}function n(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function o(a,b){var c=b||(Array.isArray(a)?[]:{});for(var d in a)c[d]=a[d];return Array.isArray(a)&&(c.length=a.length),c}function p(a,b,c,d){if(this.closed=!1,this.object=a,this.callback=b,this.target=c,this.token=d,this.reporting=!0,K){var e=this;this.boundInternalCallback=function(a){e.internalCallback(a)}}q(this)}function q(a){$&&(Z.push(a),p._allObserversCount++)}function r(a,b,c,d){p.call(this,a,b,c,d),this.connect(),this.sync(!0)}function s(a,b,c,d){if(!Array.isArray(a))throw Error("Provided object is not an Array");r.call(this,a,b,c,d)}function t(a){this.arr=[],this.callback=a,this.isObserved=!0}function u(a,b,c,d,e,g,h){var b=b instanceof i?b:j(b);return b&&b.length&&f(a)?(p.call(this,a,c,d,e),this.valueFn=g,this.setValueFn=h,this.path=b,this.connect(),this.sync(!0),void 0):(this.value_=b?b.getValueFrom(a):void 0,this.value=g?g(this.value_):this.value_,this.closed=!0,void 0)}function v(a,b,c,d){p.call(this,void 0,a,b,c),this.valueFn=d,this.observed=[],this.values=[],this.value=void 0,this.oldValue=void 0,this.oldValues=void 0,this.changeFlags=void 0,this.started=!1}function w(a,b){if("function"==typeof Object.observe){var c=Object.getNotifier(a);return function(d,e){var f={object:a,type:d,name:b};2===arguments.length&&(f.oldValue=e),c.notify(f)}}}function x(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];db[g.type]?(g.name in c||(c[g.name]=g.oldValue),g.type!=G&&(g.type!=F?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function y(a,b,c){return{index:a,removed:b,addedCount:c}}function z(){}function A(a,b,c,d,e,f){return ib.calcSplices(a,b,c,d,e,f)}function B(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function C(a,b,c,d){for(var e=y(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=B(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function D(a,b){for(var c=[],f=0;f<b.length;f++){var g=b[f];switch(g.type){case J:C(c,g.index,g.removed.slice(),g.addedCount);break;case F:case G:case I:if(!d(g.name))continue;var h=e(g.name);if(0>h)continue;C(c,h,[g.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(g))}}return c}function E(a,b){var c=[];return D(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?(b.removed[0]!==a[b.index]&&c.push(b),void 0):(c=c.concat(A(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)),void 0)}),c}var F="add",G="update",H="reconfigure",I="delete",J="splice",K=b(),L=c(),M=a.Number.isNaN||function(b){return"number"==typeof b&&a.isNaN(b)},N="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},O="[$_a-zA-Z]",P="[$_a-zA-Z0-9]",Q=O+"+"+P+"*",R="(?:[0-9]|[1-9]+[0-9]+)",S="(?:"+Q+"|"+R+")",T="(?:"+S+")(?:\\s*\\.\\s*"+S+")*",U=new RegExp("^"+T+"$"),V={},W={};i.get=j,i.prototype=N({__proto__:[],valid:!0,toString:function(){return this.join(".")},getValueFrom:function(a,b){for(var c=0;c<this.length;c++){if(null==a)return;b&&b.observe(a),a=a[this[c]]}return a},compiledGetValueFromFn:function(){var a=this.map(function(a){return d(a)?'["'+a+'"]':"."+a}),b="",c="obj";b+="if (obj != null";for(var e=0;e<this.length-1;e++)this[e],c+=a[e],b+=" &&\n     "+c+" != null";return b+=")\n",c+=a[e],b+="  return "+c+";\nelse\n  return undefined;",new Function("obj",b)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!f(a))return!1;a=a[this[c]]}return f(a)?(a[this[c]]=b,!0):!1}});var X=new i("",V);X.valid=!1,X.getValueFrom=X.setValueFrom=function(){};var Y=1e3;p.prototype={internalCallback:function(a){this.closed||this.reporting&&this.check(a)&&(this.report(),this.testingResults&&(this.testingResults.anyChanged=!0))},close:function(){this.closed||(this.object&&"function"==typeof this.object.close&&this.object.close(),this.disconnect(),this.object=void 0,this.closed=!0)},deliver:function(a){this.closed||(K?(this.testingResults=a,Object.deliverChangeRecords(this.boundInternalCallback),this.testingResults=void 0):k(this))},report:function(){this.reporting&&(this.sync(!1),this.callback&&(this.reportArgs.push(this.token),this.invokeCallback(this.reportArgs)),this.reportArgs=void 0)},invokeCallback:function(a){try{this.callback.apply(this.target,a)}catch(b){p._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},reset:function(){this.closed||(K&&(this.reporting=!1,Object.deliverChangeRecords(this.boundInternalCallback),this.reporting=!0),this.sync(!0))}};var Z,$=!K||a.forceCollectObservers;p._allObserversCount=0,$&&(Z=[]);var _=!1,ab="function"==typeof Object.deliverAllChangeRecords;a.Platform=a.Platform||{},a.Platform.performMicrotaskCheckpoint=function(){if(!_){if(ab)return Object.deliverAllChangeRecords(),void 0;if($){_=!0;var b=0,c={};do{b++;var d=Z;Z=[],c.anyChanged=!1;for(var e=0;e<d.length;e++){var f=d[e];f.closed||(K?f.deliver(c):f.check()&&(c.anyChanged=!0,f.report()),Z.push(f))}}while(Y>b&&c.anyChanged);a.testingExposeCycleCount&&(a.dirtyCheckCycleCount=b),p._allObserversCount=Z.length,_=!1}}},$&&(a.Platform.clearObservers=function(){Z=[]}),r.prototype=N({__proto__:p.prototype,connect:function(){K&&Object.observe(this.object,this.boundInternalCallback)},sync:function(){K||(this.oldObject=o(this.object))},check:function(a){var b,c;if(K){if(!a)return!1;c={},b=x(this.object,a,c)}else c=this.oldObject,b=n(this.object,this.oldObject);return m(b)?!1:(this.reportArgs=[b.added||{},b.removed||{},b.changed||{}],this.reportArgs.push(function(a){return c[a]}),!0)},disconnect:function(){K?this.object&&Object.unobserve(this.object,this.boundInternalCallback):this.oldObject=void 0}}),s.prototype=N({__proto__:r.prototype,connect:function(){K&&Array.observe(this.object,this.boundInternalCallback)},sync:function(){K||(this.oldObject=this.object.slice())},check:function(a){var b;if(K){if(!a)return!1;b=E(this.object,a)}else b=A(this.object,0,this.object.length,this.oldObject,0,this.oldObject.length);return b&&b.length?(this.reportArgs=[b],!0):!1}}),s.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})};var bb=Object.getPrototypeOf({}),cb=Object.getPrototypeOf([]);t.prototype={reset:function(){this.isObserved=!this.isObserved},observe:function(a){if(f(a)&&a!==bb&&a!==cb){var b=this.arr.indexOf(a);b>=0&&this.arr[b+1]===this.isObserved||(0>b&&(b=this.arr.length,this.arr[b]=a,Object.observe(a,this.callback)),this.arr[b+1]=this.isObserved,this.observe(Object.getPrototypeOf(a)))}},cleanup:function(){for(var a=0,b=0,c=this.isObserved;b<this.arr.length;){var d=this.arr[b];this.arr[b+1]==c?(b>a&&(this.arr[a]=d,this.arr[a+1]=c),a+=2):Object.unobserve(d,this.callback),b+=2}this.arr.length=a}},u.prototype=N({__proto__:p.prototype,connect:function(){K&&(this.observedSet=new t(this.boundInternalCallback))},disconnect:function(){this.value=void 0,this.value_=void 0,this.observedSet&&(this.observedSet.reset(),this.observedSet.cleanup(),this.observedSet=void 0)},check:function(){return this.observedSet&&this.observedSet.reset(),this.value_=this.path.getValueFrom(this.object,this.observedSet),this.observedSet&&this.observedSet.cleanup(),g(this.value_,this.oldValue_)?!1:(this.value=this.valueFn?this.valueFn(this.value_):this.value_,this.reportArgs=[this.value,this.oldValue],!0)},sync:function(a){a&&(this.observedSet&&this.observedSet.reset(),this.value_=this.path.getValueFrom(this.object,this.observedSet),this.value=this.valueFn?this.valueFn(this.value_):this.value_,this.observedSet&&this.observedSet.cleanup()),this.oldValue_=this.value_,this.oldValue=this.value},setValue:function(a){this.path&&("function"==typeof this.setValueFn&&(a=this.setValueFn(a)),this.path.setValueFrom(this.object,a))}}),v.prototype=N({__proto__:u.prototype,addPath:function(a,b){if(this.started)throw Error("Cannot add more paths once started.");var b=b instanceof i?b:j(b),c=b?b.getValueFrom(a):void 0;this.observed.push(a,b),this.values.push(c)},start:function(){this.started=!0,this.connect(),this.sync(!0)},getValues:function(){this.observedSet&&this.observedSet.reset();for(var a=!1,b=0;b<this.observed.length;b+=2){var c=this.observed[b+1];if(c){var d=this.observed[b],e=c.getValueFrom(d,this.observedSet),f=this.values[b/2];if(!g(e,f)){if(!a&&!this.valueFn){this.oldValues=this.oldValues||[],this.changeFlags=this.changeFlags||[];for(var h=0;h<this.values.length;h++)this.oldValues[h]=this.values[h],this.changeFlags[h]=!1}this.valueFn||(this.changeFlags[b/2]=!0),this.values[b/2]=e,a=!0}}}return this.observedSet&&this.observedSet.cleanup(),a},check:function(){if(this.getValues()){if(this.valueFn){if(this.value=this.valueFn(this.values),g(this.value,this.oldValue))return!1;this.reportArgs=[this.value,this.oldValue]}else this.reportArgs=[this.values,this.oldValues,this.changeFlags,this.observed];return!0}},sync:function(a){a&&(this.getValues(),this.valueFn&&(this.value=this.valueFn(this.values))),this.valueFn&&(this.oldValue=this.value)},close:function(){if(this.observed){for(var a=0;a<this.observed.length;a+=2){var b=this.observed[a];b&&"function"==typeof b.close&&b.close()}this.observed=void 0,this.values=void 0}p.prototype.close.call(this)}});var db={};db[F]=!0,db[G]=!0,db[I]=!0,u.defineProperty=function(a,b,c){var d=c.object,e=j(c.path),f=w(a,b),g=new u(d,c.path,function(a,b){f&&f(G,b)});return Object.defineProperty(a,b,{get:function(){return e.getValueFrom(d)},set:function(a){e.setValueFrom(d,a)},configurable:!0}),{close:function(){var c=e.getValueFrom(d);f&&g.deliver(),g.close(),Object.defineProperty(a,b,{value:c,writable:!0,configurable:!0})}}};var eb=0,fb=1,gb=2,hb=3;z.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(eb):(e.push(fb),d=g),b--,c--):f==h?(e.push(hb),b--,d=h):(e.push(gb),c--,d=i)}else e.push(hb),b--;else e.push(gb),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,0==c-b&&0==f-e)return[];if(b==c){for(var j=y(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[y(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case eb:j&&(l.push(j),j=void 0),m++,n++;break;case fb:j||(j=y(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case gb:j||(j=y(m,[],0)),j.addedCount++,m++;break;case hb:j||(j=y(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var ib=new z;a.Observer=p,a.Observer.hasObjectObserve=K,a.ArrayObserver=s,a.ArrayObserver.calculateSplices=function(a,b){return ib.calculateSplices(a,b)},a.ArraySplice=z,a.ObjectObserver=r,a.PathObserver=u,a.CompoundPathObserver=v,a.Path=i,a.Observer.changeRecordTypes={add:F,update:G,reconfigure:H,"delete":I,splice:J}}("undefined"!=typeof global&&global?global:this),"undefined"==typeof WeakMap&&!function(){var a=Object.defineProperty,b=Date.now()%1e9,c=function(){this.name="__st"+(1e9*Math.random()>>>0)+(b++ +"__")};c.prototype={set:function(b,c){var d=b[this.name];d&&d[0]===b?d[1]=c:a(b,this.name,{value:[b,c],writable:!0})},get:function(a){var b;return(b=a[this.name])&&b[0]===a?b[1]:void 0},"delete":function(a){this.set(a,void 0)}},window.WeakMap=c}();var ShadowDOMPolyfill={};!function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a,b){return Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))}),a}function d(a,b){return Object.getOwnPropertyNames(b).forEach(function(c){switch(c){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":return}Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))}),a}function e(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function f(a){var b=a.__proto__||Object.getPrototypeOf(a),c=D.get(b);if(c)return c;var d=f(b),e=s(d);return p(b,e,a),e}function g(a,b){n(a,b,!0)}function h(a,b){n(b,a,!1)}function i(a){return/^on[a-z]+$/.test(a)}function j(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function k(a){return G&&j(a)?new Function("return this.impl."+a):function(){return this.impl[a]}}function l(a){return G&&j(a)?new Function("v","this.impl."+a+" = v"):function(b){this.impl[a]=b}}function m(a){return G&&j(a)?new Function("return this.impl."+a+".apply(this.impl, arguments)"):function(){return this.impl[a].apply(this.impl,arguments)}}function n(b,c,d){Object.getOwnPropertyNames(b).forEach(function(e){if(!(e in c)){J&&b.__lookupGetter__(e);var f;try{f=Object.getOwnPropertyDescriptor(b,e)}catch(g){f=K}var h,j;if(d&&"function"==typeof f.value)return c[e]=m(e),void 0;var n=i(e);h=n?a.getEventHandlerGetter(e):k(e),(f.writable||f.set)&&(j=n?a.getEventHandlerSetter(e):l(e)),Object.defineProperty(c,e,{get:h,set:j,configurable:f.configurable,enumerable:f.enumerable})}})}function o(a,b,c){var e=a.prototype;p(e,b,c),d(b,a)}function p(a,c,d){var e=c.prototype;b(void 0===D.get(a)),D.set(a,c),E.set(e,a),g(a,e),d&&h(e,d)}function q(a,b){return D.get(b.prototype)===a}function r(a){var b=Object.getPrototypeOf(a),c=f(b),d=s(c);return p(b,d,a),d}function s(a){function b(b){a.call(this,b)}return b.prototype=Object.create(a.prototype),b.prototype.constructor=b,b}function t(a){return a instanceof F.EventTarget||a instanceof F.Event||a instanceof F.Range||a instanceof F.DOMImplementation||a instanceof F.CanvasRenderingContext2D||F.WebGLRenderingContext&&a instanceof F.WebGLRenderingContext}function u(a){return a instanceof N||a instanceof M||a instanceof O||a instanceof P||a instanceof L||a instanceof Q||R&&a instanceof R}function v(a){return null===a?null:(b(u(a)),a.polymerWrapper_||(a.polymerWrapper_=new(f(a))(a)))}function w(a){return null===a?null:(b(t(a)),a.impl)}function x(a){return a&&t(a)?w(a):a}function y(a){return a&&!t(a)?v(a):a}function z(a,c){null!==c&&(b(u(a)),b(void 0===c||t(c)),a.polymerWrapper_=c)}function A(a,b,c){Object.defineProperty(a.prototype,b,{get:c,configurable:!0,enumerable:!0})}function B(a,b){A(a,b,function(){return v(this.impl[b])})}function C(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=y(this);return a[b].apply(a,arguments)}})})}var D=new WeakMap,E=new WeakMap,F=Object.create(null),G=!("securityPolicy"in document)||document.securityPolicy.allowsEval;if(G)try{var H=new Function("","return true;");G=H()}catch(I){G=!1}Object.getOwnPropertyNames(window);var J=/Firefox/.test(navigator.userAgent),K={get:function(){},set:function(){},configurable:!0,enumerable:!0},L=window.DOMImplementation,M=window.Event,N=window.Node,O=window.Window,P=window.Range,Q=window.CanvasRenderingContext2D,R=window.WebGLRenderingContext;a.assert=b,a.constructorTable=D,a.defineGetter=A,a.defineWrapGetter=B,a.forwardMethodsToWrapper=C,a.isWrapperFor=q,a.mixin=c,a.nativePrototypeTable=E,a.oneOf=e,a.registerObject=r,a.registerWrapper=o,a.rewrap=z,a.unwrap=w,a.unwrapIfNeeded=x,a.wrap=v,a.wrapIfNeeded=y,a.wrappers=F}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof O.ShadowRoot}function c(a){var b=a.localName;return"content"===b||"shadow"===b}function d(a){return!!a.shadowRoot}function e(a){var b;return a.parentNode||(b=a.defaultView)&&N(b)||null}function f(f,g,h){if(h.length)return h.shift();if(b(f))return j(f)||a.getHostForShadowRoot(f);var i=a.eventParentsTable.get(f);if(i){for(var k=1;k<i.length;k++)h[k-1]=i[k];return i[0]}if(g&&c(f)){var l=f.parentNode;if(l&&d(l))for(var m=a.getShadowTrees(l),n=j(g),k=0;k<m.length;k++)if(m[k].contains(n))return n}return e(f)}function g(a){for(var d=[],e=a,g=[],i=[];e;){var j=null;if(c(e)){j=h(d);var k=d[d.length-1]||e;d.push(k)}else d.length||d.push(e);var l=d[d.length-1];g.push({target:l,currentTarget:e}),b(e)&&d.pop(),e=f(e,j,i)}return g}function h(a){for(var b=a.length-1;b>=0;b--)if(!c(a[b]))return a[b];return null}function i(d,e){for(var g=[];d;){for(var i=[],j=e,l=void 0;j;){var n=null;if(i.length){if(c(j)&&(n=h(i),k(l))){var o=i[i.length-1];i.push(o)}}else i.push(j);if(m(j,d))return i[i.length-1];b(j)&&i.pop(),l=j,j=f(j,n,g)}d=b(d)?a.getHostForShadowRoot(d):d.parentNode}}function j(b){return a.insertionParentTable.get(b)}function k(a){return j(a)}function l(a){for(var b;b=a.parentNode;)a=b;return a}function m(a,b){return l(a)===l(b)}function n(b,c){if(b===c)return!0;if(b instanceof O.ShadowRoot){var d=a.getHostForShadowRoot(b);return n(l(d),c)}return!1}function o(){Z++}function p(){Z--}function q(b){if(!Q.get(b)){if(Q.set(b,!0),b instanceof $){if(Z)return}else a.renderAllPending();var c=N(b.target),d=N(b);return r(d,c)}}function r(a,b){var c=g(b);return"load"===a.type&&2===c.length&&c[0].target instanceof O.Document&&c.shift(),Y.set(a,c),s(a,c)&&t(a,c)&&u(a,c),U.set(a,x.NONE),S.set(a,null),a.defaultPrevented}function s(a,b){for(var c,d=b.length-1;d>0;d--){var e=b[d].target,f=b[d].currentTarget;if(e!==f&&(c=x.CAPTURING_PHASE,!v(b[d],a,c)))return!1}return!0}function t(a,b){var c=x.AT_TARGET;return v(b[0],a,c)}function u(a,b){for(var c,d=a.bubbles,e=1;e<b.length;e++){var f=b[e].target,g=b[e].currentTarget;if(f===g)c=x.AT_TARGET;else{if(!d||W.get(a))continue;c=x.BUBBLING_PHASE}if(!v(b[e],a,c))return}}function v(a,b,c){var d=a.target,e=a.currentTarget,f=P.get(e);if(!f)return!0;if("relatedTarget"in b){var g=M(b);if(g.relatedTarget){var h=N(g.relatedTarget),j=i(e,h);if(j===d)return!0;T.set(b,j)}}U.set(b,c);var k=b.type,l=!1;R.set(b,d),S.set(b,e);for(var m=0;m<f.length;m++){var n=f[m];if(n.removed)l=!0;else if(!(n.type!==k||!n.capture&&c===x.CAPTURING_PHASE||n.capture&&c===x.BUBBLING_PHASE))try{if("function"==typeof n.handler?n.handler.call(e,b):n.handler.handleEvent(b),W.get(b))return!1}catch(o){window.onerror?window.onerror(o.message):console.error(o,o.stack)}}if(l){var p=f.slice();f.length=0;for(var m=0;m<p.length;m++)p[m].removed||f.push(p[m])}return!V.get(b)}function w(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function x(a,b){return a instanceof _?(this.impl=a,void 0):N(B(_,"Event",a,b))}function y(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:M(a.relatedTarget)}}):a}function z(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?(this.impl=b,void 0):N(B(d,a,b,c))};return e.prototype=Object.create(b.prototype),c&&K(e.prototype,c),d&&(d.prototype["init"+a]?L(d,e,document.createEvent(a)):L(d,e,new d("temp"))),e}function A(a,b){return function(){arguments[b]=M(arguments[b]);var c=M(this);c[a].apply(c,arguments)}}function B(a,b,c,d){if(jb)return new a(c,y(d));var e=M(document.createEvent(b)),f=ib[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=M(b)),g.push(b)}),e["init"+b].apply(e,g),e}function C(a){return"function"==typeof a?!0:a&&a.handleEvent}function D(a){this.impl=a}function E(b){return b instanceof O.ShadowRoot&&(b=a.getHostForShadowRoot(b)),M(b)}function F(a){J(a,mb)}function G(b,c,d,e){a.renderAllPending();for(var f=N(nb.call(c.impl,d,e)),h=g(f,this),i=0;i<h.length;i++){var j=h[i];if(j.currentTarget===b)return j.target}return null}function H(a){return function(){var b=X.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=X.get(this);d||(d=Object.create(null),X.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var J=a.forwardMethodsToWrapper,K=a.mixin,L=a.registerWrapper,M=a.unwrap,N=a.wrap,O=a.wrappers;new WeakMap;var P=new WeakMap,Q=new WeakMap,R=new WeakMap,S=new WeakMap,T=new WeakMap,U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=0,$=window.MutationEvent;w.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var _=window.Event;x.prototype={get target(){return R.get(this)},get currentTarget(){return S.get(this)},get eventPhase(){return U.get(this)},get path(){var a=new O.NodeList,b=Y.get(this);if(b){for(var c=0,d=b.length-1,e=l(S.get(this)),f=0;d>=f;f++){var g=b[f].currentTarget,h=l(g);n(e,h)&&(f!==d||g instanceof O.Node)&&(a[c++]=g)}a.length=c}return a},stopPropagation:function(){V.set(this,!0)},stopImmediatePropagation:function(){V.set(this,!0),W.set(this,!0)}},L(_,x,document.createEvent("Event"));var ab=z("UIEvent",x),bb=z("CustomEvent",x),cb={get relatedTarget(){return T.get(this)||N(M(this).relatedTarget)}},db=K({initMouseEvent:A("initMouseEvent",14)},cb),eb=K({initFocusEvent:A("initFocusEvent",5)},cb),fb=z("MouseEvent",ab,db),gb=z("FocusEvent",ab,eb),hb=z("MutationEvent",x,{initMutationEvent:A("initMutationEvent",3),get relatedNode(){return N(this.impl.relatedNode)}}),ib=Object.create(null),jb=function(){try{new window.MouseEvent("click")}catch(a){return!1}return!0}();if(!jb){var kb=function(a,b,c){if(c){var d=ib[c];b=K(K({},d),b)}ib[a]=b};kb("Event",{bubbles:!1,cancelable:!1}),kb("CustomEvent",{detail:null},"Event"),kb("UIEvent",{view:null,detail:0},"Event"),kb("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),kb("FocusEvent",{relatedTarget:null},"UIEvent")}var lb=window.EventTarget,mb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;mb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),D.prototype={addEventListener:function(a,b,c){if(C(b)){var d=new w(a,b,c),e=P.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],P.set(this,e);e.push(d);var g=E(this);g.addEventListener_(a,q,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=P.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=E(this);h.removeEventListener_(a,q,!0)}}},dispatchEvent:function(a){var b=E(this),c=M(a);return Q.set(c,!1),b.dispatchEvent_(c)}},lb&&L(lb,D);var nb=document.elementFromPoint;a.adjustRelatedTarget=i,a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.muteMutationEvents=o,a.unmuteMutationEvents=p,a.wrapEventTargetMethods=F,a.wrappers.CustomEvent=bb,a.wrappers.Event=x,a.wrappers.EventTarget=D,a.wrappers.FocusEvent=gb,a.wrappers.MouseEvent=fb,a.wrappers.MutationEvent=hb,a.wrappers.UIEvent=ab}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,{enumerable:!1})}function c(){this.length=0,b(this,"length")}function d(a){if(null==a)return a;for(var b=new c,d=0,e=a.length;e>d;d++)b[d]=f(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(this.impl[b].apply(this.impl,arguments))}}var f=a.wrap;c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){o(a instanceof k)}function c(a,b,c,d){if(!(a instanceof DocumentFragment))return a.parentNode&&a.parentNode.removeChild(a),a.parentNode_=b,a.previousSibling_=c,a.nextSibling_=d,c&&(c.nextSibling_=a),d&&(d.previousSibling_=a),[a];for(var e,f=[];e=a.firstChild;)a.removeChild(e),f.push(e),e.parentNode_=b;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||c,f[g].nextSibling_=f[g+1]||d;return c&&(c.nextSibling_=f[0]),d&&(d.previousSibling_=f[f.length-1]),f}function d(a){if(a instanceof DocumentFragment){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}return[a]}function e(a){for(var b=0;b<a.length;b++)a[b].nodeWasAdded_()}function f(a,b){var c=a.nodeType===k.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function g(b,c){if(c.length){var d=b.ownerDocument;if(d!==c[0].ownerDocument)for(var e=0;e<c.length;e++)a.adoptNodeNoRemove(c[e],d)}}function h(a,b){g(a,b);var c=b.length;if(1===c)return r(b[0]);for(var d=r(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(r(b[e]));return d}function i(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){o(b.parentNode===a);var c=b.nextSibling,d=r(b),e=d.parentNode;e&&y.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=r(a),g=f.firstChild;g;)c=g.nextSibling,y.call(f,g),g=c}function j(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function k(a){o(a instanceof u),l.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0}var l=a.wrappers.EventTarget,m=a.wrappers.NodeList,n=a.defineWrapGetter,o=a.assert,p=a.mixin,q=a.registerWrapper,r=a.unwrap,s=a.wrap,t=a.wrapIfNeeded,u=window.Node,v=u.prototype.appendChild,w=u.prototype.insertBefore,x=u.prototype.replaceChild,y=u.prototype.removeChild,z=u.prototype.compareDocumentPosition;k.prototype=Object.create(l.prototype),p(k.prototype,{appendChild:function(a){b(a);var g;if(this.invalidateShadowRenderer()||j(a)){var i=this.lastChild,k=null;g=c(a,this,i,k),this.lastChild_=g[g.length-1],i||(this.firstChild_=g[0]),v.call(this.impl,h(this,g))}else g=d(a),f(this,a),v.call(this.impl,r(a));return e(g),a},insertBefore:function(a,i){if(!i)return this.appendChild(a);b(a),b(i),o(i.parentNode===this);var k;if(this.invalidateShadowRenderer()||j(a)){var l=i.previousSibling,m=i;k=c(a,this,l,m),this.firstChild===i&&(this.firstChild_=k[0]);var n=r(i),p=n.parentNode;p?w.call(p,h(this,k),n):g(this,k)}else k=d(a),f(this,a),w.call(this.impl,r(a),r(i));return e(k),a},removeChild:function(a){if(b(a),a.parentNode!==this)throw new Error("NotFoundError");var c=r(a);if(this.invalidateShadowRenderer()){var d=this.firstChild,e=this.lastChild,f=a.nextSibling,g=a.previousSibling,h=c.parentNode;h&&y.call(h,c),d===a&&(this.firstChild_=f),e===a&&(this.lastChild_=g),g&&(g.nextSibling_=f),f&&(f.previousSibling_=g),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else y.call(this.impl,c);return a},replaceChild:function(a,g){if(b(a),b(g),g.parentNode!==this)throw new Error("NotFoundError");var i,k=r(g);if(this.invalidateShadowRenderer()||j(a)){var l=g.previousSibling,m=g.nextSibling;m===a&&(m=a.nextSibling),i=c(a,this,l,m),this.firstChild===g&&(this.firstChild_=i[0]),this.lastChild===g&&(this.lastChild_=i[i.length-1]),g.previousSibling_=g.nextSibling_=g.parentNode_=void 0,k.parentNode&&x.call(k.parentNode,h(this,i),k)}else i=d(a),f(this,a),x.call(this.impl,r(a),k);return e(i),g},nodeWasAdded_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeWasAdded_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:s(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:s(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:s(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:s(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:s(this.impl.previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==k.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)a+=b.textContent;return a},set textContent(a){if(this.invalidateShadowRenderer()){if(i(this),""!==a){var b=this.impl.ownerDocument.createTextNode(a);this.appendChild(b)}}else this.impl.textContent=a},get childNodes(){for(var a=new m,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){if(!this.invalidateShadowRenderer())return s(this.impl.cloneNode(a));var b=s(this.impl.cloneNode(!1));if(a)for(var c=this.firstChild;c;c=c.nextSibling)b.appendChild(c.cloneNode(!0));
+return b},contains:function(a){if(!a)return!1;if(a=t(a),a===this)return!0;var b=a.parentNode;return b?this.contains(b):!1},compareDocumentPosition:function(a){return z.call(this.impl,r(a))}}),n(k,"ownerDocument"),q(u,k,document.createDocumentFragment()),delete k.prototype.querySelector,delete k.prototype.querySelectorAll,k.prototype=p(Object.create(l.prototype),k.prototype),a.wrappers.Node=k}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a,c){for(var d,e=a.firstElementChild;e;){if(e.matches(c))return e;if(d=b(e,c))return d;e=e.nextElementSibling}return null}function c(a,b,d){for(var e=a.firstElementChild;e;)e.matches(b)&&(d[d.length++]=e),c(e,b,d),e=e.nextElementSibling;return d}var d={querySelector:function(a){return b(this,a)},querySelectorAll:function(a){return c(this,a,new NodeList)}},e={getElementsByTagName:function(a){return this.querySelectorAll(a)},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){if("*"===a)return this.getElementsByTagName(b);for(var c=new NodeList,d=this.getElementsByTagName(b),e=0,f=0;e<d.length;e++)d[e].namespaceURI===a&&(c[f++]=d[e]);return c.length=f,c}};a.GetElementsByInterface=e,a.SelectorsInterface=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.previousSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.mixin,f=a.registerWrapper,g=window.CharacterData;b.prototype=Object.create(d.prototype),e(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a}}),e(b.prototype,c),f(g,b,document.createTextNode("")),a.wrappers.CharacterData=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(b,c){var d=b.parentNode;if(d&&d.shadowRoot){var e=a.getRendererForHost(d);e.dependsOnAttribute(c)&&e.invalidate()}}function c(a){g.call(this,a)}function d(a,c,d){var e=d||c;Object.defineProperty(a,c,{get:function(){return this.impl[c]},set:function(a){this.impl[c]=a,b(this,e)},configurable:!0,enumerable:!0})}var e=a.ChildNodeInterface,f=a.GetElementsByInterface,g=a.wrappers.Node,h=a.ParentNodeInterface,i=a.SelectorsInterface;a.addWrapNodeListMethod;var j=a.mixin,k=a.oneOf,l=a.registerWrapper,m=a.wrappers,n=window.Element,o=k(n.prototype,["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"]),p=n.prototype[o];c.prototype=Object.create(g.prototype),j(c.prototype,{createShadowRoot:function(){var b=new m.ShadowRoot(this);this.impl.polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return this.impl.polymerShadowRoot_||null},setAttribute:function(a,c){this.impl.setAttribute(a,c),b(this,a)},removeAttribute:function(a){this.impl.removeAttribute(a),b(this,a)},matches:function(a){return p.call(this.impl,a)}}),c.prototype[o]=function(a){return this.matches(a)},n.prototype.webkitCreateShadowRoot&&(c.prototype.webkitCreateShadowRoot=c.prototype.createShadowRoot),d(c.prototype,"id"),d(c.prototype,"className","class"),j(c.prototype,e),j(c.prototype,f),j(c.prototype,h),j(c.prototype,i),l(n,c),a.matchesName=o,a.wrappers.Element=c}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case'"':return"&quot;"}}function c(a){return a.replace(r,b)}function d(a){switch(a.nodeType){case Node.ELEMENT_NODE:for(var b,d=a.tagName.toLowerCase(),f="<"+d,g=a.attributes,h=0;b=g[h];h++)f+=" "+b.name+'="'+c(b.value)+'"';return f+=">",s[d]?f:f+e(a)+"</"+d+">";case Node.TEXT_NODE:return c(a.nodeValue);case Node.COMMENT_NODE:return"<!--"+c(a.nodeValue)+"-->";default:throw console.error(a),new Error("not implemented")}}function e(a){for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=d(c);return b}function f(a,b,c){var d=c||"div";a.textContent="";var e=p(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(q(f))}function g(a){l.call(this,a)}function h(b){return function(){return a.renderAllPending(),this.impl[b]}}function i(a){m(g,a,h(a))}function j(b){Object.defineProperty(g.prototype,b,{get:h(b),set:function(c){a.renderAllPending(),this.impl[b]=c},configurable:!0,enumerable:!0})}function k(b){Object.defineProperty(g.prototype,b,{value:function(){return a.renderAllPending(),this.impl[b].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var l=a.wrappers.Element,m=a.defineGetter,n=a.mixin,o=a.registerWrapper,p=a.unwrap,q=a.wrap,r=/&|<|"/g,s={area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},t=window.HTMLElement;g.prototype=Object.create(l.prototype),n(g.prototype,{get innerHTML(){return e(this)},set innerHTML(a){this.invalidateShadowRenderer()?f(this,a,this.tagName):this.impl.innerHTML=a},get outerHTML(){return d(this)},set outerHTML(a){var b=this.parentNode;b&&(b.invalidateShadowRenderer(),this.impl.outerHTML=a)}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(i),["scrollLeft","scrollTop"].forEach(j),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(k),o(t,g,document.createElement("b")),a.wrappers.HTMLElement=g,a.getInnerHTML=e,a.setInnerHTML=f}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrap,g=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=this.impl.getContext.apply(this.impl,arguments);return a&&f(a)}}),e(g,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));void 0!==a&&(e.width=a),void 0!==b&&(e.height=b),d.call(this,e),g(e,this)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{}),f&&e(f,b),a.wrappers.HTMLShadowElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=o.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);o.set(a,b)}return b}function c(a){var c,d=b(a.ownerDocument),e=l(d.createDocumentFragment());for(h();c=a.firstChild;)e.appendChild(c);return k(),e}function d(a){if(e.call(this,a),!p){var b=c(a);n.set(this,m(b))}}var e=a.wrappers.HTMLElement,f=a.getInnerHTML,g=a.mixin,h=a.muteMutationEvents,i=a.registerWrapper,j=a.setInnerHTML,k=a.unmuteMutationEvents,l=a.unwrap,m=a.wrap,n=new WeakMap,o=new WeakMap,p=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),g(d.prototype,{get content(){return p?m(this.impl.content):n.get(this)},get innerHTML(){return f(this.content)},set innerHTML(a){j(this.content,a)}}),p&&i(p,d),a.wrappers.HTMLTemplateElement=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement;a.mixin;var g=a.registerWrapper,h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.unwrapIfNeeded,g=a.wrap,h=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return g(this.impl.canvas)},drawImage:function(){arguments[0]=f(arguments[0]),this.impl.drawImage.apply(this.impl,arguments)},createPattern:function(){return arguments[0]=e(arguments[0]),this.impl.createPattern.apply(this.impl,arguments)}}),d(h,b),a.wrappers.CanvasRenderingContext2D=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrapIfNeeded,f=a.wrap,g=window.WebGLRenderingContext;g&&(c(b.prototype,{get canvas(){return f(this.impl.canvas)},texImage2D:function(){arguments[5]=e(arguments[5]),this.impl.texImage2D.apply(this.impl,arguments)},texSubImage2D:function(){arguments[6]=e(arguments[6]),this.impl.texSubImage2D.apply(this.impl,arguments)}}),d(g,b),a.wrappers.WebGLRenderingContext=b)}(this.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createTextNode("")),i=f(document.createComment(""));a.wrappers.Comment=i,a.wrappers.DocumentFragment=g,a.wrappers.Text=h}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=i(a.impl.ownerDocument.createDocumentFragment());c.call(this,b),g(b,this);var d=a.shadowRoot;k.set(this,d),j.set(this,a)}var c=a.wrappers.DocumentFragment,d=a.elementFromPoint,e=a.getInnerHTML,f=a.mixin,g=a.rewrap,h=a.setInnerHTML,i=a.unwrap,j=new WeakMap,k=new WeakMap;b.prototype=Object.create(c.prototype),f(b.prototype,{get innerHTML(){return e(this)},set innerHTML(a){h(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return k.get(this)||null},invalidateShadowRenderer:function(){return j.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return d(this,this.ownerDocument,a,b)},getElementById:function(a){return this.querySelector("#"+a)}}),a.wrappers.ShadowRoot=b,a.getHostForShadowRoot=function(a){return j.get(a)}}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a,c,e){var f=G(a),g=G(c),h=e?G(e):null;if(d(c),b(c),e)a.firstChild===e&&(a.firstChild_=e),e.previousSibling_=e.previousSibling;else{a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var i=H(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=G(a),d=c.parentNode;if(d){var e=H(d);b(a),a.previousSibling&&(a.previousSibling.nextSibling_=a),a.nextSibling&&(a.nextSibling.previousSibling_=a),e.lastChild===a&&(e.lastChild_=a),e.firstChild===a&&(e.firstChild_=a),d.removeChild(c)}}function e(a,b){g(b).push(a),x(a,b);var c=J.get(a);c||J.set(a,c=[]),c.push(b)}function f(a){I.set(a,[])}function g(a){return I.get(a)}function h(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function i(a,b,c){for(var d=a.firstChild;d;d=d.nextSibling)if(b(d)){if(c(d)===!1)return}else i(d,b,c)}function j(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof y))return!1;if(!M.test(c))return!1;if(":"===c[0]&&!N.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function k(){for(var a=0;a<P.length;a++)P[a].render();P=[]}function l(){F=null,k()}function m(a){var b=L.get(a);return b||(b=new q(a),L.set(a,b)),b}function n(a){for(;a;a=a.parentNode)if(a instanceof C)return a;return null}function o(a){return m(D(a))}function p(a){this.skip=!1,this.node=a,this.childNodes=[]}function q(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function r(a){return a instanceof z}function s(a){return a instanceof z}function t(a){return a instanceof A}function u(a){return a instanceof A}function v(a){return a.shadowRoot}function w(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}function x(a,b){K.set(a,b)}var y=a.wrappers.Element,z=a.wrappers.HTMLContentElement,A=a.wrappers.HTMLShadowElement,B=a.wrappers.Node,C=a.wrappers.ShadowRoot;a.assert;var D=a.getHostForShadowRoot;a.mixin,a.muteMutationEvents;var E=a.oneOf;a.unmuteMutationEvents;var F,G=a.unwrap,H=a.wrap,I=new WeakMap,J=new WeakMap,K=new WeakMap,L=new WeakMap,M=/^[*.:#[a-zA-Z_|]/,N=new RegExp("^:("+["link","visited","target","enabled","disabled","checked","indeterminate","nth-child","nth-last-child","nth-of-type","nth-last-of-type","first-child","last-child","first-of-type","last-of-type","only-of-type"].join("|")+")"),O=E(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),P=[],Q=new ArraySplice;Q.equals=function(a,b){return G(a.node)===b},p.prototype={append:function(a){var b=new p(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=h(G(b)),g=a||new WeakMap,i=Q.calculateSplices(e,f),j=0,k=0,l=0,m=0;m<i.length;m++){for(var n=i[m];l<n.index;l++)k++,e[j++].sync(g);for(var o=n.removed.length,p=0;o>p;p++){var q=H(f[k++]);g.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&H(f[k]),p=0;r>p;p++){var t=e[j++],u=t.node;c(b,u,s),g.set(u,!0),t.sync(g)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(g)}}},q.prototype={render:function(a){if(this.dirty){this.invalidateAttributes(),this.treeComposition();var b=this.host,c=b.shadowRoot;this.associateNode(b);for(var d=!e,e=a||new p(b),f=c.firstChild;f;f=f.nextSibling)this.renderNode(c,e,f,!1);d&&e.sync(),this.dirty=!1}},invalidate:function(){if(!this.dirty){if(this.dirty=!0,P.push(this),F)return;F=window[O](l,0)}},renderNode:function(a,b,c,d){if(v(c)){b=b.append(c);var e=m(c);e.dirty=!0,e.render(b)}else r(c)?this.renderInsertionPoint(a,b,c,d):t(c)?this.renderShadowInsertionPoint(a,b,c):this.renderAsAnyDomTree(a,b,c,d)},renderAsAnyDomTree:function(a,b,c,d){if(b=b.append(c),v(c)){var e=m(c);b.skip=!e.dirty,e.render(b)}else for(var f=c.firstChild;f;f=f.nextSibling)this.renderNode(a,b,f,d)},renderInsertionPoint:function(a,b,c,d){var e=g(c);if(e.length){this.associateNode(c);for(var f=0;f<e.length;f++){var h=e[f];r(h)&&d?this.renderInsertionPoint(a,b,h,d):this.renderAsAnyDomTree(a,b,h,d)}}else this.renderFallbackContent(a,b,c);this.associateNode(c.parentNode)},renderShadowInsertionPoint:function(a,b,c){var d=a.olderShadowRoot;if(d){x(d,c),this.associateNode(c.parentNode);for(var e=d.firstChild;e;e=e.nextSibling)this.renderNode(d,b,e,!0)}else this.renderFallbackContent(a,b,c)},renderFallbackContent:function(a,b,c){this.associateNode(c),this.associateNode(c.parentNode);for(var d=c.firstChild;d;d=d.nextSibling)this.renderAsAnyDomTree(a,b,d,!1)},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},distribute:function(a,b){var c=this;i(a,s,function(a){f(a),c.updateDependentAttributes(a.getAttribute("select"));for(var d=0;d<b.length;d++){var g=b[d];void 0!==g&&j(g,a)&&(e(g,a),b[d]=void 0)}})},treeComposition:function(){for(var a=this.host,b=a.shadowRoot,c=[],d=a.firstChild;d;d=d.nextSibling)if(r(d)){var e=g(d);e&&e.length||(e=h(d)),c.push.apply(c,e)}else c.push(d);for(var f,j;b;){if(f=void 0,i(b,u,function(a){return f=a,!1}),j=f,this.distribute(b,c),j){var k=b.olderShadowRoot;if(k){b=k,x(b,j);continue}break}break}},associateNode:function(a){a.impl.polymerShadowRenderer_=this}},B.prototype.invalidateShadowRenderer=function(){var a=this.impl.polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},z.prototype.getDistributedNodes=function(){return k(),g(this)},A.prototype.nodeWasAdded_=z.prototype.nodeWasAdded_=function(){this.invalidateShadowRenderer();var a,b=n(this);b&&(a=o(b)),this.impl.polymerShadowRenderer_=a,a&&a.invalidate()},a.eventParentsTable=J,a.getRendererForHost=m,a.getShadowTrees=w,a.insertionParentTable=K,a.renderAllPending=k,a.visual={insertBefore:c,remove:d}}(this.ShadowDOMPolyfill),function(a){"use strict";function b(b){if(window[b]){d(!a.wrappers[b]);var i=function(a){c.call(this,a)};i.prototype=Object.create(c.prototype),e(i.prototype,{get form(){return h(g(this).form)}}),f(window[b],i,document.createElement(b.slice(4,-7))),a.wrappers[b]=i}}var c=a.wrappers.HTMLElement,d=a.assert,e=a.mixin,f=a.registerWrapper,g=a.unwrap,h=a.wrap,i=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOptionElement","HTMLOutputElement","HTMLSelectElement","HTMLTextAreaElement"];i.forEach(b)}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a)}function c(a){var c=document[a];b.prototype[a]=function(){return v(c.apply(this.impl,arguments))}}function d(a,b){y.call(b.impl,u(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof n&&f(a,b);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}function f(a,b){var c=a.olderShadowRoot;c&&b.adoptNode(c)}function g(a){this.impl=a}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return v(c.apply(this.impl,arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(this.impl,arguments)}}var j=a.GetElementsByInterface,k=a.wrappers.Node,l=a.ParentNodeInterface,m=a.SelectorsInterface,n=a.wrappers.ShadowRoot,o=a.defineWrapGetter,p=a.elementFromPoint,q=a.forwardMethodsToWrapper,r=a.matchesName,s=a.mixin,t=a.registerWrapper,u=a.unwrap,v=a.wrap,w=a.wrapEventTargetMethods;a.wrapNodeList;var x=new WeakMap;b.prototype=Object.create(k.prototype),o(b,"documentElement"),o(b,"body"),o(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var y=document.adoptNode;if(s(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return p(this,this,a,b)}}),document.register){var z=document.register;b.prototype.register=function(b,c){function d(a){return a?(this.impl=a,void 0):document.createElement(b)}var e=c.prototype;if(a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var f,g=Object.getPrototypeOf(e),h=[];g&&!(f=a.nativePrototypeTable.get(g));)h.push(g),g=Object.getPrototypeOf(g);if(!f)throw new Error("NotSupportedError");for(var i=Object.create(f),j=h.length-1;j>=0;j--)i=Object.create(i);return["createdCallback","enteredViewCallback","leftViewCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(i[a]=function(){b.apply(v(this),arguments)})}),z.call(u(this),b,c.extends?{prototype:i,"extends":c.extends}:{prototype:i}),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(i,d),a.nativePrototypeTable.set(e,i),d},q([window.HTMLDocument||window.Document],["register"])}q([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild",r]),q([window.HTMLDocument||window.Document],["adoptNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById"]),s(b.prototype,j),s(b.prototype,l),s(b.prototype,m),s(b.prototype,{get implementation(){var a=x.get(this);return a?a:(a=new g(u(this).implementation),x.set(this,a),a)}}),t(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&t(window.HTMLDocument,b),w([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),t(window.DOMImplementation,g),q([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.unwrapIfNeeded,h=a.wrap,i=a.renderAllPending,j=window.Window;b.prototype=Object.create(c.prototype);var k=window.getComputedStyle;j.prototype.getComputedStyle=function(a,b){return i(),k.call(this||window,g(a),b)},["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){j.prototype[a]=function(){var b=h(this||window);return b[a].apply(b,arguments)}}),d(b.prototype,{getComputedStyle:function(a,b){return k.call(f(this),g(a),b)}}),e(j,b),a.wrappers.Window=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}function c(a){return new b(a)}function d(a){return a.map(c)}function e(a){var b=this;this.impl=new k(function(c){a.call(b,d(c),b)})}var f=a.defineGetter,g=a.defineWrapGetter,h=a.registerWrapper,i=a.unwrapIfNeeded,j=a.wrapNodeList;a.wrappers;var k=window.MutationObserver||window.WebKitMutationObserver;if(k){var l=window.MutationRecord;b.prototype={get addedNodes(){return j(this.impl.addedNodes)},get removedNodes(){return j(this.impl.removedNodes)}},["target","previousSibling","nextSibling"].forEach(function(a){g(b,a)}),["type","attributeName","attributeNamespace","oldValue"].forEach(function(a){f(b,a,function(){return this.impl[a]})}),l&&h(l,b),window.Node,e.prototype={observe:function(a,b){this.impl.observe(i(a),b)},disconnect:function(){this.impl.disconnect()},takeRecords:function(){return d(this.impl.takeRecords())}},a.wrappers.MutationObserver=e,a.wrappers.MutationRecord=b}}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap,g=window.Range;b.prototype={get startContainer(){return f(this.impl.startContainer)},get endContainer(){return f(this.impl.endContainer)},get commonAncestorContainer(){return f(this.impl.commonAncestorContainer)},setStart:function(a,b){this.impl.setStart(e(a),b)},setEnd:function(a,b){this.impl.setEnd(e(a),b)},setStartBefore:function(a){this.impl.setStartBefore(e(a))},setStartAfter:function(a){this.impl.setStartAfter(e(a))},setEndBefore:function(a){this.impl.setEndBefore(e(a))},setEndAfter:function(a){this.impl.setEndAfter(e(a))},selectNode:function(a){this.impl.selectNode(e(a))},selectNodeContents:function(a){this.impl.selectNodeContents(e(a))},compareBoundaryPoints:function(a,b){return this.impl.compareBoundaryPoints(a,d(b))},extractContents:function(){return f(this.impl.extractContents())},cloneContents:function(){return f(this.impl.cloneContents())},insertNode:function(a){this.impl.insertNode(e(a))},surroundContents:function(a){this.impl.surroundContents(e(a))},cloneRange:function(){return f(this.impl.cloneRange())},isPointInRange:function(a,b){return this.impl.isPointInRange(e(a),b)},comparePoint:function(a,b){return this.impl.comparePoint(e(a),b)},intersectsNode:function(a){return this.impl.intersectsNode(e(a))}},g.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return f(this.impl.createContextualFragment(a))}),c(window.Range,b),a.wrappers.Range=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}a.isWrapperFor;var c={a:"HTMLAnchorElement",applet:"HTMLAppletElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",br:"HTMLBRElement",base:"HTMLBaseElement",body:"HTMLBodyElement",button:"HTMLButtonElement",dl:"HTMLDListElement",datalist:"HTMLDataListElement",data:"HTMLDataElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",hr:"HTMLHRElement",head:"HTMLHeadElement",h1:"HTMLHeadingElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",input:"HTMLInputElement",li:"HTMLLIElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",del:"HTMLModElement",ol:"HTMLOListElement",object:"HTMLObjectElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",time:"HTMLTimeElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",table:"HTMLTableElement",tr:"HTMLTableRowElement",thead:"HTMLTableSectionElement",tbody:"HTMLTableSectionElement",textarea:"HTMLTextAreaElement",track:"HTMLTrackElement",title:"HTMLTitleElement",ul:"HTMLUListElement",video:"HTMLVideoElement"};Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]}),a.knownElements=c}(this.ShadowDOMPolyfill),function(){var a=window.ShadowDOMPolyfill;a.wrap,Object.defineProperties(HTMLElement.prototype,{webkitShadowRoot:{get:function(){return this.shadowRoot}}}),HTMLElement.prototype.webkitCreateShadowRoot=HTMLElement.prototype.createShadowRoot,window.dartExperimentalFixupGetTag=function(b){function c(a){if(a instanceof d)return"NodeList";if(a instanceof e)return"ShadowRoot";if(window.MutationRecord&&a instanceof MutationRecord)return"MutationRecord";if(window.MutationObserver&&a instanceof MutationObserver)return"MutationObserver";if(a instanceof HTMLTemplateElement)return"HTMLTemplateElement";var c=f(a);if(a!==c){var g=a.constructor;if(g===c.constructor){var h=g._ShadowDOMPolyfill$cacheTag_;return h||(h=Object.prototype.toString.call(c),h=h.substring(8,h.length-1),g._ShadowDOMPolyfill$cacheTag_=h),h}a=c}return b(a)}var d=a.wrappers.NodeList,e=a.wrappers.ShadowRoot,f=a.unwrapIfNeeded;return c}}();var Platform={};!function(a){function b(a,b){var c="";return Array.prototype.forEach.call(a,function(a){c+=a.textContent+"\n\n"}),b||(c=c.replace(n,"")),c}function c(a){var b=document.createElement("style");return b.textContent=a,b}function d(a){var b=c(a);document.head.appendChild(b);var d=b.sheet.cssRules;return b.parentNode.removeChild(b),d}function e(a){for(var b=0,c=[];b<a.length;b++)c.push(a[b].cssText);return c.join("\n\n")}function f(a){a&&g().appendChild(document.createTextNode(a))}function g(){return h||(h=document.createElement("style"),h.setAttribute("ShadowCSSShim","")),h}var h,i={strictStyling:!1,registry:{},shimStyling:function(a,b,d){var e=this.isTypeExtension(d),g=this.registerDefinition(a,b,d);this.strictStyling&&this.applyScopeToContent(a,b),this.insertPolyfillDirectives(g.rootStyles),this.insertPolyfillRules(g.rootStyles);var h=this.stylesToShimmedCssText(g.scopeStyles,b,e);h+=this.extractPolyfillUnscopedRules(g.rootStyles),g.shimmedStyle=c(h),a&&(a.shimmedStyle=g.shimmedStyle);for(var i,j=0,k=g.rootStyles.length;k>j&&(i=g.rootStyles[j]);j++)i.parentNode.removeChild(i);f(h)},registerDefinition:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=a?a.querySelectorAll("style"):[];e=e?Array.prototype.slice.call(e,0):[],d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return!f||a&&!a.querySelector("shadow")||(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},isTypeExtension:function(a){return a&&a.indexOf("-")<0},applyScopeToContent:function(a,b){a&&(Array.prototype.forEach.call(a.querySelectorAll("*"),function(a){a.setAttribute(b,"")}),Array.prototype.forEach.call(a.querySelectorAll("template"),function(a){this.applyScopeToContent(a.content,b)},this))},insertPolyfillDirectives:function(a){a&&Array.prototype.forEach.call(a,function(a){a.textContent=this.insertPolyfillDirectivesInCssText(a.textContent)},this)},insertPolyfillDirectivesInCssText:function(a){return a.replace(o,function(a,b){return b.slice(0,-2)+"{"})},insertPolyfillRules:function(a){a&&Array.prototype.forEach.call(a,function(a){a.textContent=this.insertPolyfillRulesInCssText(a.textContent)},this)},insertPolyfillRulesInCssText:function(a){return a.replace(p,function(a,b){return b.slice(0,-1)})},extractPolyfillUnscopedRules:function(a){var b="";return a&&Array.prototype.forEach.call(a,function(a){b+=this.extractPolyfillUnscopedRulesFromCssText(a.textContent)+"\n\n"},this),b},extractPolyfillUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";return c},stylesToShimmedCssText:function(a,b,c){return this.shimAtHost(a,b,c)+this.shimScoping(a,b,c)},shimAtHost:function(a,b,c){return a?this.convertAtHostStyles(a,b,c):void 0},convertAtHostStyles:function(a,c,f){var g=b(a),h=this;return g=g.replace(j,function(a,b){return h.scopeHostCss(b,c,f)}),g=e(this.findAtHostRules(d(g),new RegExp("^"+c+u,"m")))},scopeHostCss:function(a,b,c){var d=this;return a.replace(k,function(a,e,f){return d.scopeHostSelector(e,b,c)+" "+f+"\n	"})},scopeHostSelector:function(a,b,c){var d=[],e=a.split(","),f="[is="+b+"]";return e.forEach(function(a){a=a.trim(),a.match(l)?a=a.replace(l,c?f+"$1$3":b+"$1$3"):a.match(m)&&(a=c?f+a:b+a),d.push(a)},this),d.join(", ")},findAtHostRules:function(a,b){return Array.prototype.filter.call(a,this.isHostRule.bind(this,b))},isHostRule:function(a,b){return b.selectorText&&b.selectorText.match(a)||b.cssRules&&this.findAtHostRules(b.cssRules,a).length||b.type==CSSRule.WEBKIT_KEYFRAMES_RULE},shimScoping:function(a,b,c){return a?this.convertScopedStyles(a,b,c):void 0},convertScopedStyles:function(a,c,e){var f=b(a).replace(j,"");f=this.insertPolyfillHostInCssText(f),f=this.convertColonHost(f),f=this.convertPseudos(f),f=this.convertParts(f),f=this.convertCombinators(f);var g=d(f);return f=this.scopeRules(g,c,e)},convertPseudos:function(a){return a.replace(r," [pseudo=$1]")},convertParts:function(a){return a.replace(s," [part=$1]")},convertColonHost:function(a){return a.replace(t,function(a,b,c,d){return c?y+c+d+", "+c+" "+b+d:b+d})},convertCombinators:function(a){return a.replace("^^"," ").replace("^"," ")},scopeRules:function(a,b,c){var d="";return Array.prototype.forEach.call(a,function(a){a.selectorText&&a.style&&a.style.cssText?(d+=this.scopeSelector(a.selectorText,b,c,this.strictStyling)+" {\n	",d+=this.propertiesFromRule(a)+"\n}\n\n"):a.media?(d+="@media "+a.media.mediaText+" {\n",d+=this.scopeRules(a.cssRules,b),d+="\n}\n\n"):a.cssText&&(d+=a.cssText+"\n\n")},this),d},scopeSelector:function(a,b,c,d){var e=[],f=a.split(",");return f.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b,c)&&(a=d?this.applyStrictSelectorScope(a,b):this.applySimpleSelectorScope(a,b,c)),e.push(a)},this),e.join(", ")
+},selectorNeedsScoping:function(a,b,c){var d=c?b:"\\[is="+b+"\\]",e=new RegExp("^("+d+")"+u,"m");return!a.match(e)},applySimpleSelectorScope:function(a,b,c){var d=c?"[is="+b+"]":b;return a.match(z)?(a=a.replace(y,d),a.replace(z,d+" ")):d+" "+a},applyStrictSelectorScope:function(a,b){var c=[" ",">","+","~"],d=a,e="["+b+"]";return c.forEach(function(a){var b=d.split(a);d=b.map(function(a){var b=a.trim().replace(z,"");return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},insertPolyfillHostInCssText:function(a){return a.replace(v,x).replace(w,x)},propertiesFromRule:function(a){var b=a.style.cssText;return a.style.content&&!a.style.content.match(/['"]+/)&&(b="content: '"+a.style.content+"';\n"+a.style.cssText.replace(/content:[^;]*;/g,"")),b}},j=/@host[^{]*{(([^}]*?{[^{]*?}[\s\S]*?)+)}/gim,k=/([^{]*)({[\s\S]*?})/gim,l=/(.*)((?:\*)|(?:\:scope))(.*)/,m=/^[.\[:]/,n=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,o=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,p=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/::(x-[^\s{,(]*)/gim,s=/::part\(([^)]*)\)/gim,t=/(-host)(?:\(([^)]*)\))?([^,{]*)/gim,u="([>\\s~+[.,{:][\\s\\S]*)?$",v=/@host/gim,w=/\:host/gim,x="-host",y="-host-no-combinator",z=/-host/gim;if(window.ShadowDOMPolyfill){f("style { display: none !important; }\n");var A=document.querySelector("head");A.insertBefore(g(),A.childNodes[0])}a.ShadowCSS=i}(window.Platform)}
\ No newline at end of file
diff --git a/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart
index c031162..90e9df2 100644
--- a/sdk/lib/async/future_impl.dart
+++ b/sdk/lib/async/future_impl.dart
@@ -514,7 +514,7 @@
         Future chainSource = listenerValueOrError;
         // Shortcut if the chain-source is already completed. Just continue the
         // loop.
-        if (chainSource is _Future && (chainSource as _Future)._isComplete) {
+        if (chainSource is _Future && chainSource._isComplete) {
           // propagate the value (simulating a tail call).
           listener._isChained = true;
           source = chainSource;
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index 1c9797c..e6b17b3 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -12,7 +12,7 @@
    * toString method.
    */
   static String safeToString(Object object) {
-    if (object is int || object is double || object is bool || null == object) {
+    if (object is num || object is bool || null == object) {
       return object.toString();
     }
     if (object is String) {
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 3a6983a..d1a106a 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -126,10 +126,17 @@
   // To suppress missing implicit constructor warnings.
   factory AbstractWorker._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [AbstractWorker].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('AbstractWorker.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<ErrorEvent> errorEvent = const EventStreamProvider<ErrorEvent>('error');
 
+  /// Stream of `error` events handled by this [AbstractWorker].
   @DomName('AbstractWorker.onerror')
   @DocsEditable()
   Stream<ErrorEvent> get onError => errorEvent.forTarget(this);
@@ -305,34 +312,82 @@
   // To suppress missing implicit constructor warnings.
   factory ApplicationCache._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `cached` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.cachedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> cachedEvent = const EventStreamProvider<Event>('cached');
 
+  /**
+   * Static factory designed to expose `checking` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.checkingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> checkingEvent = const EventStreamProvider<Event>('checking');
 
+  /**
+   * Static factory designed to expose `downloading` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.downloadingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> downloadingEvent = const EventStreamProvider<Event>('downloading');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `noupdate` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.noupdateEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> noUpdateEvent = const EventStreamProvider<Event>('noupdate');
 
+  /**
+   * Static factory designed to expose `obsolete` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.obsoleteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> obsoleteEvent = const EventStreamProvider<Event>('obsolete');
 
+  /**
+   * Static factory designed to expose `progress` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.progressEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
 
+  /**
+   * Static factory designed to expose `updateready` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.updatereadyEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> updateReadyEvent = const EventStreamProvider<Event>('updateready');
@@ -380,34 +435,42 @@
   @DocsEditable()
   void update() native;
 
+  /// Stream of `cached` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.oncached')
   @DocsEditable()
   Stream<Event> get onCached => cachedEvent.forTarget(this);
 
+  /// Stream of `checking` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onchecking')
   @DocsEditable()
   Stream<Event> get onChecking => checkingEvent.forTarget(this);
 
+  /// Stream of `downloading` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.ondownloading')
   @DocsEditable()
   Stream<Event> get onDownloading => downloadingEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `noupdate` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onnoupdate')
   @DocsEditable()
   Stream<Event> get onNoUpdate => noUpdateEvent.forTarget(this);
 
+  /// Stream of `obsolete` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onobsolete')
   @DocsEditable()
   Stream<Event> get onObsolete => obsoleteEvent.forTarget(this);
 
+  /// Stream of `progress` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onprogress')
   @DocsEditable()
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
 
+  /// Stream of `updateready` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onupdateready')
   @DocsEditable()
   Stream<Event> get onUpdateReady => updateReadyEvent.forTarget(this);
@@ -626,10 +689,16 @@
 
 @DocsEditable()
 @DomName('BeforeUnloadEvent')
-@Experimental() // untriaged
 class BeforeUnloadEvent extends Event native "BeforeUnloadEvent" {
   // To suppress missing implicit constructor warnings.
   factory BeforeUnloadEvent._() { throw new UnsupportedError("Not supported"); }
+
+  // Shadowing definition.
+  String get returnValue => JS("String", "#.returnValue", this);
+
+  void set returnValue(String value) {
+    JS("void", "#.returnValue = #", this, value);
+  }
 }
 // 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
@@ -684,50 +753,122 @@
   // To suppress missing implicit constructor warnings.
   factory BodyElement._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `blur` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.blurEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `focus` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.focusEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
 
+  /**
+   * Static factory designed to expose `hashchange` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.hashchangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> hashChangeEvent = const EventStreamProvider<Event>('hashchange');
 
+  /**
+   * Static factory designed to expose `load` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.loadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+  /**
+   * Static factory designed to expose `offline` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.offlineEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> offlineEvent = const EventStreamProvider<Event>('offline');
 
+  /**
+   * Static factory designed to expose `online` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.onlineEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> onlineEvent = const EventStreamProvider<Event>('online');
 
+  /**
+   * Static factory designed to expose `popstate` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.popstateEvent')
   @DocsEditable()
   static const EventStreamProvider<PopStateEvent> popStateEvent = const EventStreamProvider<PopStateEvent>('popstate');
 
+  /**
+   * Static factory designed to expose `resize` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.resizeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
 
+  /**
+   * Static factory designed to expose `storage` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.storageEvent')
   @DocsEditable()
   static const EventStreamProvider<StorageEvent> storageEvent = const EventStreamProvider<StorageEvent>('storage');
 
+  /**
+   * Static factory designed to expose `unload` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.unloadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
@@ -742,50 +883,62 @@
    */
   BodyElement.created() : super.created();
 
+  /// Stream of `blur` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onblur')
   @DocsEditable()
   ElementStream<Event> get onBlur => blurEvent.forElement(this);
 
+  /// Stream of `error` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onerror')
   @DocsEditable()
   ElementStream<Event> get onError => errorEvent.forElement(this);
 
+  /// Stream of `focus` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onfocus')
   @DocsEditable()
   ElementStream<Event> get onFocus => focusEvent.forElement(this);
 
+  /// Stream of `hashchange` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onhashchange')
   @DocsEditable()
   ElementStream<Event> get onHashChange => hashChangeEvent.forElement(this);
 
+  /// Stream of `load` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onload')
   @DocsEditable()
   ElementStream<Event> get onLoad => loadEvent.forElement(this);
 
+  /// Stream of `message` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onmessage')
   @DocsEditable()
   ElementStream<MessageEvent> get onMessage => messageEvent.forElement(this);
 
+  /// Stream of `offline` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onoffline')
   @DocsEditable()
   ElementStream<Event> get onOffline => offlineEvent.forElement(this);
 
+  /// Stream of `online` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.ononline')
   @DocsEditable()
   ElementStream<Event> get onOnline => onlineEvent.forElement(this);
 
+  /// Stream of `popstate` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onpopstate')
   @DocsEditable()
   ElementStream<PopStateEvent> get onPopState => popStateEvent.forElement(this);
 
+  /// Stream of `resize` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onresize')
   @DocsEditable()
   ElementStream<Event> get onResize => resizeEvent.forElement(this);
 
+  /// Stream of `storage` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onstorage')
   @DocsEditable()
   ElementStream<StorageEvent> get onStorage => storageEvent.forElement(this);
 
+  /// Stream of `unload` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onunload')
   @DocsEditable()
   ElementStream<Event> get onUnload => unloadEvent.forElement(this);
@@ -922,10 +1075,22 @@
   // To suppress missing implicit constructor warnings.
   factory CanvasElement._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `webglcontextlost` events to event
+   * handlers that are not necessarily instances of [CanvasElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLCanvasElement.webglcontextlostEvent')
   @DocsEditable()
   static const EventStreamProvider<gl.ContextEvent> webGlContextLostEvent = const EventStreamProvider<gl.ContextEvent>('webglcontextlost');
 
+  /**
+   * Static factory designed to expose `webglcontextrestored` events to event
+   * handlers that are not necessarily instances of [CanvasElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLCanvasElement.webglcontextrestoredEvent')
   @DocsEditable()
   static const EventStreamProvider<gl.ContextEvent> webGlContextRestoredEvent = const EventStreamProvider<gl.ContextEvent>('webglcontextrestored');
@@ -978,10 +1143,12 @@
   @DocsEditable()
   String _toDataUrl(String type, [num quality]) native;
 
+  /// Stream of `webglcontextlost` events handled by this [CanvasElement].
   @DomName('HTMLCanvasElement.onwebglcontextlost')
   @DocsEditable()
   ElementStream<gl.ContextEvent> get onWebGlContextLost => webGlContextLostEvent.forElement(this);
 
+  /// Stream of `webglcontextrestored` events handled by this [CanvasElement].
   @DomName('HTMLCanvasElement.onwebglcontextrestored')
   @DocsEditable()
   ElementStream<gl.ContextEvent> get onWebGlContextRestored => webGlContextRestoredEvent.forElement(this);
@@ -1904,19 +2071,14 @@
 @DocsEditable()
 @DomName('Comment')
 class Comment extends CharacterData native "Comment" {
-  // To suppress missing implicit constructor warnings.
-  factory Comment._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('Comment.Comment')
-  @DocsEditable()
   factory Comment([String data]) {
     if (data != null) {
-      return Comment._create_1(data);
+      return JS('Comment', '#.createComment(#)', document, data);
     }
-    return Comment._create_2();
+    return JS('Comment', '#.createComment("")', document);
   }
-  static Comment _create_1(data) => JS('Comment', 'new Comment(#)', data);
-  static Comment _create_2() => JS('Comment', 'new Comment()');
+  // To suppress missing implicit constructor warnings.
+  factory Comment._() { throw new UnsupportedError("Not supported"); }
 }
 // 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
@@ -6354,6 +6516,12 @@
   // To suppress missing implicit constructor warnings.
   factory DedicatedWorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [DedicatedWorkerGlobalScope].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('DedicatedWorkerGlobalScope.messageEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -6364,6 +6532,7 @@
   @Experimental() // untriaged
   void postMessage(Object message, [List messagePorts]) native;
 
+  /// Stream of `message` events handled by this [DedicatedWorkerGlobalScope].
   @DomName('DedicatedWorkerGlobalScope.onmessage')
   @DocsEditable()
   @Experimental() // untriaged
@@ -6824,20 +6993,44 @@
   // To suppress missing implicit constructor warnings.
   factory Document._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `readystatechange` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.readystatechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> readyStateChangeEvent = const EventStreamProvider<Event>('readystatechange');
 
+  /**
+   * Static factory designed to expose `securitypolicyviolation` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.securitypolicyviolationEvent')
   @DocsEditable()
   // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#widl-Document-onsecuritypolicyviolation
   @Experimental()
   static const EventStreamProvider<SecurityPolicyViolationEvent> securityPolicyViolationEvent = const EventStreamProvider<SecurityPolicyViolationEvent>('securitypolicyviolation');
 
+  /**
+   * Static factory designed to expose `selectionchange` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.selectionchangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> selectionChangeEvent = const EventStreamProvider<Event>('selectionchange');
 
+  /**
+   * Static factory designed to expose `pointerlockchange` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.webkitpointerlockchangeEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -6846,6 +7039,12 @@
   // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-onpointerlockchange
   static const EventStreamProvider<Event> pointerLockChangeEvent = const EventStreamProvider<Event>('webkitpointerlockchange');
 
+  /**
+   * Static factory designed to expose `pointerlockerror` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.webkitpointerlockerrorEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -7193,230 +7392,282 @@
   @DocsEditable()
   final Element _lastElementChild;
 
+  /// Stream of `abort` events handled by this [Document].
   @DomName('Document.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => Element.abortEvent.forTarget(this);
 
+  /// Stream of `beforecopy` events handled by this [Document].
   @DomName('Document.onbeforecopy')
   @DocsEditable()
   Stream<Event> get onBeforeCopy => Element.beforeCopyEvent.forTarget(this);
 
+  /// Stream of `beforecut` events handled by this [Document].
   @DomName('Document.onbeforecut')
   @DocsEditable()
   Stream<Event> get onBeforeCut => Element.beforeCutEvent.forTarget(this);
 
+  /// Stream of `beforepaste` events handled by this [Document].
   @DomName('Document.onbeforepaste')
   @DocsEditable()
   Stream<Event> get onBeforePaste => Element.beforePasteEvent.forTarget(this);
 
+  /// Stream of `blur` events handled by this [Document].
   @DomName('Document.onblur')
   @DocsEditable()
   Stream<Event> get onBlur => Element.blurEvent.forTarget(this);
 
+  /// Stream of `change` events handled by this [Document].
   @DomName('Document.onchange')
   @DocsEditable()
   Stream<Event> get onChange => Element.changeEvent.forTarget(this);
 
+  /// Stream of `click` events handled by this [Document].
   @DomName('Document.onclick')
   @DocsEditable()
   Stream<MouseEvent> get onClick => Element.clickEvent.forTarget(this);
 
+  /// Stream of `contextmenu` events handled by this [Document].
   @DomName('Document.oncontextmenu')
   @DocsEditable()
   Stream<MouseEvent> get onContextMenu => Element.contextMenuEvent.forTarget(this);
 
+  /// Stream of `copy` events handled by this [Document].
   @DomName('Document.oncopy')
   @DocsEditable()
   Stream<Event> get onCopy => Element.copyEvent.forTarget(this);
 
+  /// Stream of `cut` events handled by this [Document].
   @DomName('Document.oncut')
   @DocsEditable()
   Stream<Event> get onCut => Element.cutEvent.forTarget(this);
 
+  /// Stream of `doubleclick` events handled by this [Document].
   @DomName('Document.ondblclick')
   @DocsEditable()
   Stream<Event> get onDoubleClick => Element.doubleClickEvent.forTarget(this);
 
+  /// Stream of `drag` events handled by this [Document].
   @DomName('Document.ondrag')
   @DocsEditable()
   Stream<MouseEvent> get onDrag => Element.dragEvent.forTarget(this);
 
+  /// Stream of `dragend` events handled by this [Document].
   @DomName('Document.ondragend')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnd => Element.dragEndEvent.forTarget(this);
 
+  /// Stream of `dragenter` events handled by this [Document].
   @DomName('Document.ondragenter')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnter => Element.dragEnterEvent.forTarget(this);
 
+  /// Stream of `dragleave` events handled by this [Document].
   @DomName('Document.ondragleave')
   @DocsEditable()
   Stream<MouseEvent> get onDragLeave => Element.dragLeaveEvent.forTarget(this);
 
+  /// Stream of `dragover` events handled by this [Document].
   @DomName('Document.ondragover')
   @DocsEditable()
   Stream<MouseEvent> get onDragOver => Element.dragOverEvent.forTarget(this);
 
+  /// Stream of `dragstart` events handled by this [Document].
   @DomName('Document.ondragstart')
   @DocsEditable()
   Stream<MouseEvent> get onDragStart => Element.dragStartEvent.forTarget(this);
 
+  /// Stream of `drop` events handled by this [Document].
   @DomName('Document.ondrop')
   @DocsEditable()
   Stream<MouseEvent> get onDrop => Element.dropEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [Document].
   @DomName('Document.onerror')
   @DocsEditable()
   Stream<Event> get onError => Element.errorEvent.forTarget(this);
 
+  /// Stream of `focus` events handled by this [Document].
   @DomName('Document.onfocus')
   @DocsEditable()
   Stream<Event> get onFocus => Element.focusEvent.forTarget(this);
 
+  /// Stream of `input` events handled by this [Document].
   @DomName('Document.oninput')
   @DocsEditable()
   Stream<Event> get onInput => Element.inputEvent.forTarget(this);
 
+  /// Stream of `invalid` events handled by this [Document].
   @DomName('Document.oninvalid')
   @DocsEditable()
   Stream<Event> get onInvalid => Element.invalidEvent.forTarget(this);
 
+  /// Stream of `keydown` events handled by this [Document].
   @DomName('Document.onkeydown')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyDown => Element.keyDownEvent.forTarget(this);
 
+  /// Stream of `keypress` events handled by this [Document].
   @DomName('Document.onkeypress')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyPress => Element.keyPressEvent.forTarget(this);
 
+  /// Stream of `keyup` events handled by this [Document].
   @DomName('Document.onkeyup')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyUp => Element.keyUpEvent.forTarget(this);
 
+  /// Stream of `load` events handled by this [Document].
   @DomName('Document.onload')
   @DocsEditable()
   Stream<Event> get onLoad => Element.loadEvent.forTarget(this);
 
+  /// Stream of `mousedown` events handled by this [Document].
   @DomName('Document.onmousedown')
   @DocsEditable()
   Stream<MouseEvent> get onMouseDown => Element.mouseDownEvent.forTarget(this);
 
+  /// Stream of `mouseenter` events handled by this [Document].
   @DomName('Document.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseEnter => Element.mouseEnterEvent.forTarget(this);
 
+  /// Stream of `mouseleave` events handled by this [Document].
   @DomName('Document.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseLeave => Element.mouseLeaveEvent.forTarget(this);
 
+  /// Stream of `mousemove` events handled by this [Document].
   @DomName('Document.onmousemove')
   @DocsEditable()
   Stream<MouseEvent> get onMouseMove => Element.mouseMoveEvent.forTarget(this);
 
+  /// Stream of `mouseout` events handled by this [Document].
   @DomName('Document.onmouseout')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOut => Element.mouseOutEvent.forTarget(this);
 
+  /// Stream of `mouseover` events handled by this [Document].
   @DomName('Document.onmouseover')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOver => Element.mouseOverEvent.forTarget(this);
 
+  /// Stream of `mouseup` events handled by this [Document].
   @DomName('Document.onmouseup')
   @DocsEditable()
   Stream<MouseEvent> get onMouseUp => Element.mouseUpEvent.forTarget(this);
 
+  /// Stream of `mousewheel` events handled by this [Document].
   @DomName('Document.onmousewheel')
   @DocsEditable()
   Stream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent.forTarget(this);
 
+  /// Stream of `paste` events handled by this [Document].
   @DomName('Document.onpaste')
   @DocsEditable()
   Stream<Event> get onPaste => Element.pasteEvent.forTarget(this);
 
+  /// Stream of `readystatechange` events handled by this [Document].
   @DomName('Document.onreadystatechange')
   @DocsEditable()
   Stream<Event> get onReadyStateChange => readyStateChangeEvent.forTarget(this);
 
+  /// Stream of `reset` events handled by this [Document].
   @DomName('Document.onreset')
   @DocsEditable()
   Stream<Event> get onReset => Element.resetEvent.forTarget(this);
 
+  /// Stream of `scroll` events handled by this [Document].
   @DomName('Document.onscroll')
   @DocsEditable()
   Stream<Event> get onScroll => Element.scrollEvent.forTarget(this);
 
+  /// Stream of `search` events handled by this [Document].
   @DomName('Document.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   Stream<Event> get onSearch => Element.searchEvent.forTarget(this);
 
+  /// Stream of `securitypolicyviolation` events handled by this [Document].
   @DomName('Document.onsecuritypolicyviolation')
   @DocsEditable()
   // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#widl-Document-onsecuritypolicyviolation
   @Experimental()
   Stream<SecurityPolicyViolationEvent> get onSecurityPolicyViolation => securityPolicyViolationEvent.forTarget(this);
 
+  /// Stream of `select` events handled by this [Document].
   @DomName('Document.onselect')
   @DocsEditable()
   Stream<Event> get onSelect => Element.selectEvent.forTarget(this);
 
+  /// Stream of `selectionchange` events handled by this [Document].
   @DomName('Document.onselectionchange')
   @DocsEditable()
   Stream<Event> get onSelectionChange => selectionChangeEvent.forTarget(this);
 
+  /// Stream of `selectstart` events handled by this [Document].
   @DomName('Document.onselectstart')
   @DocsEditable()
   Stream<Event> get onSelectStart => Element.selectStartEvent.forTarget(this);
 
+  /// Stream of `submit` events handled by this [Document].
   @DomName('Document.onsubmit')
   @DocsEditable()
   Stream<Event> get onSubmit => Element.submitEvent.forTarget(this);
 
+  /// Stream of `touchcancel` events handled by this [Document].
   @DomName('Document.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchCancel => Element.touchCancelEvent.forTarget(this);
 
+  /// Stream of `touchend` events handled by this [Document].
   @DomName('Document.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchEnd => Element.touchEndEvent.forTarget(this);
 
+  /// Stream of `touchmove` events handled by this [Document].
   @DomName('Document.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchMove => Element.touchMoveEvent.forTarget(this);
 
+  /// Stream of `touchstart` events handled by this [Document].
   @DomName('Document.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchStart => Element.touchStartEvent.forTarget(this);
 
+  /// Stream of `fullscreenchange` events handled by this [Document].
   @DomName('Document.onwebkitfullscreenchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
   Stream<Event> get onFullscreenChange => Element.fullscreenChangeEvent.forTarget(this);
 
+  /// Stream of `fullscreenerror` events handled by this [Document].
   @DomName('Document.onwebkitfullscreenerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
   Stream<Event> get onFullscreenError => Element.fullscreenErrorEvent.forTarget(this);
 
+  /// Stream of `pointerlockchange` events handled by this [Document].
   @DomName('Document.onwebkitpointerlockchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-onpointerlockchange
   @Experimental()
   Stream<Event> get onPointerLockChange => pointerLockChangeEvent.forTarget(this);
 
+  /// Stream of `pointerlockerror` events handled by this [Document].
   @DomName('Document.onwebkitpointerlockerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-onpointerlockerror
@@ -8138,213 +8389,355 @@
   @Experimental()
   CssRect get marginEdge;
 
+  /// Stream of `abort` events handled by this [Element].
   @DomName('Element.onabort')
   @DocsEditable()
   ElementStream<Event> get onAbort;
 
+  /// Stream of `beforecopy` events handled by this [Element].
   @DomName('Element.onbeforecopy')
   @DocsEditable()
   ElementStream<Event> get onBeforeCopy;
 
+  /// Stream of `beforecut` events handled by this [Element].
   @DomName('Element.onbeforecut')
   @DocsEditable()
   ElementStream<Event> get onBeforeCut;
 
+  /// Stream of `beforepaste` events handled by this [Element].
   @DomName('Element.onbeforepaste')
   @DocsEditable()
   ElementStream<Event> get onBeforePaste;
 
+  /// Stream of `blur` events handled by this [Element].
   @DomName('Element.onblur')
   @DocsEditable()
   ElementStream<Event> get onBlur;
 
+  /// Stream of `change` events handled by this [Element].
   @DomName('Element.onchange')
   @DocsEditable()
   ElementStream<Event> get onChange;
 
+  /// Stream of `click` events handled by this [Element].
   @DomName('Element.onclick')
   @DocsEditable()
   ElementStream<MouseEvent> get onClick;
 
+  /// Stream of `contextmenu` events handled by this [Element].
   @DomName('Element.oncontextmenu')
   @DocsEditable()
   ElementStream<MouseEvent> get onContextMenu;
 
+  /// Stream of `copy` events handled by this [Element].
   @DomName('Element.oncopy')
   @DocsEditable()
   ElementStream<Event> get onCopy;
 
+  /// Stream of `cut` events handled by this [Element].
   @DomName('Element.oncut')
   @DocsEditable()
   ElementStream<Event> get onCut;
 
+  /// Stream of `doubleclick` events handled by this [Element].
   @DomName('Element.ondblclick')
   @DocsEditable()
   ElementStream<Event> get onDoubleClick;
 
+  /**
+   * A stream of `drag` events fired when this element currently being dragged.
+   *
+   * A `drag` event is added to this stream as soon as the drag begins.
+   * A `drag` event is also added to this stream at intervals while the drag
+   * operation is still ongoing.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrag')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrag;
 
+  /**
+   * A stream of `dragend` events fired when this element completes a drag
+   * operation.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragend')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnd;
 
+  /**
+   * A stream of `dragenter` events fired when a dragged object is first dragged
+   * over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragenter')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnter;
 
+  /**
+   * A stream of `dragleave` events fired when an object being dragged over this
+   * element leaves this element's target area.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragleave')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragLeave;
 
+  /**
+   * A stream of `dragover` events fired when a dragged object is currently
+   * being dragged over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragover')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragOver;
 
+  /**
+   * A stream of `dragstart` events fired when this element starts being
+   * dragged.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragstart')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragStart;
 
+  /**
+   * A stream of `drop` events fired when a dragged object is dropped on this
+   * element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrop')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrop;
 
+  /// Stream of `error` events handled by this [Element].
   @DomName('Element.onerror')
   @DocsEditable()
   ElementStream<Event> get onError;
 
+  /// Stream of `focus` events handled by this [Element].
   @DomName('Element.onfocus')
   @DocsEditable()
   ElementStream<Event> get onFocus;
 
+  /// Stream of `input` events handled by this [Element].
   @DomName('Element.oninput')
   @DocsEditable()
   ElementStream<Event> get onInput;
 
+  /// Stream of `invalid` events handled by this [Element].
   @DomName('Element.oninvalid')
   @DocsEditable()
   ElementStream<Event> get onInvalid;
 
+  /// Stream of `keydown` events handled by this [Element].
   @DomName('Element.onkeydown')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyDown;
 
+  /// Stream of `keypress` events handled by this [Element].
   @DomName('Element.onkeypress')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyPress;
 
+  /// Stream of `keyup` events handled by this [Element].
   @DomName('Element.onkeyup')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyUp;
 
+  /// Stream of `load` events handled by this [Element].
   @DomName('Element.onload')
   @DocsEditable()
   ElementStream<Event> get onLoad;
 
+  /// Stream of `mousedown` events handled by this [Element].
   @DomName('Element.onmousedown')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseDown;
 
+  /// Stream of `mouseenter` events handled by this [Element].
   @DomName('Element.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseEnter;
 
+  /// Stream of `mouseleave` events handled by this [Element].
   @DomName('Element.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseLeave;
 
+  /// Stream of `mousemove` events handled by this [Element].
   @DomName('Element.onmousemove')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseMove;
 
+  /// Stream of `mouseout` events handled by this [Element].
   @DomName('Element.onmouseout')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOut;
 
+  /// Stream of `mouseover` events handled by this [Element].
   @DomName('Element.onmouseover')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOver;
 
+  /// Stream of `mouseup` events handled by this [Element].
   @DomName('Element.onmouseup')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseUp;
 
+  /// Stream of `mousewheel` events handled by this [Element].
   @DomName('Element.onmousewheel')
   @DocsEditable()
   // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
   @Experimental() // non-standard
   ElementStream<WheelEvent> get onMouseWheel;
 
+  /// Stream of `paste` events handled by this [Element].
   @DomName('Element.onpaste')
   @DocsEditable()
   ElementStream<Event> get onPaste;
 
+  /// Stream of `reset` events handled by this [Element].
   @DomName('Element.onreset')
   @DocsEditable()
   ElementStream<Event> get onReset;
 
+  /// Stream of `scroll` events handled by this [Element].
   @DomName('Element.onscroll')
   @DocsEditable()
   ElementStream<Event> get onScroll;
 
+  /// Stream of `search` events handled by this [Element].
   @DomName('Element.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   ElementStream<Event> get onSearch;
 
+  /// Stream of `select` events handled by this [Element].
   @DomName('Element.onselect')
   @DocsEditable()
   ElementStream<Event> get onSelect;
 
+  /// Stream of `selectstart` events handled by this [Element].
   @DomName('Element.onselectstart')
   @DocsEditable()
   @Experimental() // nonstandard
   ElementStream<Event> get onSelectStart;
 
+  /// Stream of `submit` events handled by this [Element].
   @DomName('Element.onsubmit')
   @DocsEditable()
   ElementStream<Event> get onSubmit;
 
+  /// Stream of `touchcancel` events handled by this [Element].
   @DomName('Element.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchCancel;
 
+  /// Stream of `touchend` events handled by this [Element].
   @DomName('Element.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnd;
 
+  /// Stream of `touchenter` events handled by this [Element].
   @DomName('Element.ontouchenter')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnter;
 
+  /// Stream of `touchleave` events handled by this [Element].
   @DomName('Element.ontouchleave')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchLeave;
 
+  /// Stream of `touchmove` events handled by this [Element].
   @DomName('Element.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchMove;
 
+  /// Stream of `touchstart` events handled by this [Element].
   @DomName('Element.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchStart;
 
+  /// Stream of `transitionend` events handled by this [Element].
   @DomName('Element.ontransitionend')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -8353,12 +8746,14 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   ElementStream<TransitionEvent> get onTransitionEnd;
 
+  /// Stream of `fullscreenchange` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
   ElementStream<Event> get onFullscreenChange;
 
+  /// Stream of `fullscreenerror` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
@@ -8427,213 +8822,355 @@
   List<Node> get rawList => _nodeList;
 
 
+  /// Stream of `abort` events handled by this [Element].
   @DomName('Element.onabort')
   @DocsEditable()
   ElementStream<Event> get onAbort => Element.abortEvent._forElementList(this);
 
+  /// Stream of `beforecopy` events handled by this [Element].
   @DomName('Element.onbeforecopy')
   @DocsEditable()
   ElementStream<Event> get onBeforeCopy => Element.beforeCopyEvent._forElementList(this);
 
+  /// Stream of `beforecut` events handled by this [Element].
   @DomName('Element.onbeforecut')
   @DocsEditable()
   ElementStream<Event> get onBeforeCut => Element.beforeCutEvent._forElementList(this);
 
+  /// Stream of `beforepaste` events handled by this [Element].
   @DomName('Element.onbeforepaste')
   @DocsEditable()
   ElementStream<Event> get onBeforePaste => Element.beforePasteEvent._forElementList(this);
 
+  /// Stream of `blur` events handled by this [Element].
   @DomName('Element.onblur')
   @DocsEditable()
   ElementStream<Event> get onBlur => Element.blurEvent._forElementList(this);
 
+  /// Stream of `change` events handled by this [Element].
   @DomName('Element.onchange')
   @DocsEditable()
   ElementStream<Event> get onChange => Element.changeEvent._forElementList(this);
 
+  /// Stream of `click` events handled by this [Element].
   @DomName('Element.onclick')
   @DocsEditable()
   ElementStream<MouseEvent> get onClick => Element.clickEvent._forElementList(this);
 
+  /// Stream of `contextmenu` events handled by this [Element].
   @DomName('Element.oncontextmenu')
   @DocsEditable()
   ElementStream<MouseEvent> get onContextMenu => Element.contextMenuEvent._forElementList(this);
 
+  /// Stream of `copy` events handled by this [Element].
   @DomName('Element.oncopy')
   @DocsEditable()
   ElementStream<Event> get onCopy => Element.copyEvent._forElementList(this);
 
+  /// Stream of `cut` events handled by this [Element].
   @DomName('Element.oncut')
   @DocsEditable()
   ElementStream<Event> get onCut => Element.cutEvent._forElementList(this);
 
+  /// Stream of `doubleclick` events handled by this [Element].
   @DomName('Element.ondblclick')
   @DocsEditable()
   ElementStream<Event> get onDoubleClick => Element.doubleClickEvent._forElementList(this);
 
+  /**
+   * A stream of `drag` events fired when this element currently being dragged.
+   *
+   * A `drag` event is added to this stream as soon as the drag begins.
+   * A `drag` event is also added to this stream at intervals while the drag
+   * operation is still ongoing.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrag')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrag => Element.dragEvent._forElementList(this);
 
+  /**
+   * A stream of `dragend` events fired when this element completes a drag
+   * operation.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragend')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnd => Element.dragEndEvent._forElementList(this);
 
+  /**
+   * A stream of `dragenter` events fired when a dragged object is first dragged
+   * over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragenter')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnter => Element.dragEnterEvent._forElementList(this);
 
+  /**
+   * A stream of `dragleave` events fired when an object being dragged over this
+   * element leaves this element's target area.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragleave')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragLeave => Element.dragLeaveEvent._forElementList(this);
 
+  /**
+   * A stream of `dragover` events fired when a dragged object is currently
+   * being dragged over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragover')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragOver => Element.dragOverEvent._forElementList(this);
 
+  /**
+   * A stream of `dragstart` events fired when this element starts being
+   * dragged.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragstart')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragStart => Element.dragStartEvent._forElementList(this);
 
+  /**
+   * A stream of `drop` events fired when a dragged object is dropped on this
+   * element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrop')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrop => Element.dropEvent._forElementList(this);
 
+  /// Stream of `error` events handled by this [Element].
   @DomName('Element.onerror')
   @DocsEditable()
   ElementStream<Event> get onError => Element.errorEvent._forElementList(this);
 
+  /// Stream of `focus` events handled by this [Element].
   @DomName('Element.onfocus')
   @DocsEditable()
   ElementStream<Event> get onFocus => Element.focusEvent._forElementList(this);
 
+  /// Stream of `input` events handled by this [Element].
   @DomName('Element.oninput')
   @DocsEditable()
   ElementStream<Event> get onInput => Element.inputEvent._forElementList(this);
 
+  /// Stream of `invalid` events handled by this [Element].
   @DomName('Element.oninvalid')
   @DocsEditable()
   ElementStream<Event> get onInvalid => Element.invalidEvent._forElementList(this);
 
+  /// Stream of `keydown` events handled by this [Element].
   @DomName('Element.onkeydown')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyDown => Element.keyDownEvent._forElementList(this);
 
+  /// Stream of `keypress` events handled by this [Element].
   @DomName('Element.onkeypress')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyPress => Element.keyPressEvent._forElementList(this);
 
+  /// Stream of `keyup` events handled by this [Element].
   @DomName('Element.onkeyup')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyUp => Element.keyUpEvent._forElementList(this);
 
+  /// Stream of `load` events handled by this [Element].
   @DomName('Element.onload')
   @DocsEditable()
   ElementStream<Event> get onLoad => Element.loadEvent._forElementList(this);
 
+  /// Stream of `mousedown` events handled by this [Element].
   @DomName('Element.onmousedown')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseDown => Element.mouseDownEvent._forElementList(this);
 
+  /// Stream of `mouseenter` events handled by this [Element].
   @DomName('Element.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseEnter => Element.mouseEnterEvent._forElementList(this);
 
+  /// Stream of `mouseleave` events handled by this [Element].
   @DomName('Element.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseLeave => Element.mouseLeaveEvent._forElementList(this);
 
+  /// Stream of `mousemove` events handled by this [Element].
   @DomName('Element.onmousemove')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseMove => Element.mouseMoveEvent._forElementList(this);
 
+  /// Stream of `mouseout` events handled by this [Element].
   @DomName('Element.onmouseout')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOut => Element.mouseOutEvent._forElementList(this);
 
+  /// Stream of `mouseover` events handled by this [Element].
   @DomName('Element.onmouseover')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOver => Element.mouseOverEvent._forElementList(this);
 
+  /// Stream of `mouseup` events handled by this [Element].
   @DomName('Element.onmouseup')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseUp => Element.mouseUpEvent._forElementList(this);
 
+  /// Stream of `mousewheel` events handled by this [Element].
   @DomName('Element.onmousewheel')
   @DocsEditable()
   // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
   @Experimental() // non-standard
   ElementStream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent._forElementList(this);
 
+  /// Stream of `paste` events handled by this [Element].
   @DomName('Element.onpaste')
   @DocsEditable()
   ElementStream<Event> get onPaste => Element.pasteEvent._forElementList(this);
 
+  /// Stream of `reset` events handled by this [Element].
   @DomName('Element.onreset')
   @DocsEditable()
   ElementStream<Event> get onReset => Element.resetEvent._forElementList(this);
 
+  /// Stream of `scroll` events handled by this [Element].
   @DomName('Element.onscroll')
   @DocsEditable()
   ElementStream<Event> get onScroll => Element.scrollEvent._forElementList(this);
 
+  /// Stream of `search` events handled by this [Element].
   @DomName('Element.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   ElementStream<Event> get onSearch => Element.searchEvent._forElementList(this);
 
+  /// Stream of `select` events handled by this [Element].
   @DomName('Element.onselect')
   @DocsEditable()
   ElementStream<Event> get onSelect => Element.selectEvent._forElementList(this);
 
+  /// Stream of `selectstart` events handled by this [Element].
   @DomName('Element.onselectstart')
   @DocsEditable()
   @Experimental() // nonstandard
   ElementStream<Event> get onSelectStart => Element.selectStartEvent._forElementList(this);
 
+  /// Stream of `submit` events handled by this [Element].
   @DomName('Element.onsubmit')
   @DocsEditable()
   ElementStream<Event> get onSubmit => Element.submitEvent._forElementList(this);
 
+  /// Stream of `touchcancel` events handled by this [Element].
   @DomName('Element.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchCancel => Element.touchCancelEvent._forElementList(this);
 
+  /// Stream of `touchend` events handled by this [Element].
   @DomName('Element.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnd => Element.touchEndEvent._forElementList(this);
 
+  /// Stream of `touchenter` events handled by this [Element].
   @DomName('Element.ontouchenter')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnter => Element.touchEnterEvent._forElementList(this);
 
+  /// Stream of `touchleave` events handled by this [Element].
   @DomName('Element.ontouchleave')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchLeave => Element.touchLeaveEvent._forElementList(this);
 
+  /// Stream of `touchmove` events handled by this [Element].
   @DomName('Element.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchMove => Element.touchMoveEvent._forElementList(this);
 
+  /// Stream of `touchstart` events handled by this [Element].
   @DomName('Element.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchStart => Element.touchStartEvent._forElementList(this);
 
+  /// Stream of `transitionend` events handled by this [Element].
   @DomName('Element.ontransitionend')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -8642,12 +9179,14 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   ElementStream<TransitionEvent> get onTransitionEnd => Element.transitionEndEvent._forElementList(this);
 
+  /// Stream of `fullscreenchange` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
   ElementStream<Event> get onFullscreenChange => Element.fullscreenChangeEvent._forElementList(this);
 
+  /// Stream of `fullscreenerror` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
@@ -9125,8 +9664,17 @@
   @DocsEditable()
   String get localName => _localName;
 
+  /**
+   * A URI that identifies the XML namespace of this element.
+   *
+   * `null` if no namespace URI is specified.
+   *
+   * ## Other resources
+   *
+   * * [Node.namespaceURI]
+   * (http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-NodeNSname) from W3C.
+   */
   @DomName('Element.namespaceUri')
-  @DocsEditable()
   String get namespaceUri => _namespaceUri;
 
   String toString() => localName;
@@ -9167,6 +9715,12 @@
     }
   }
 
+  /**
+   * Static factory designed to expose `mousewheel` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseWheelEvent')
   static const EventStreamProvider<WheelEvent> mouseWheelEvent =
       const _CustomEventStreamProvider<WheelEvent>(
@@ -9185,6 +9739,12 @@
     }
   }
 
+  /**
+   * Static factory designed to expose `transitionend` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.transitionEndEvent')
   static const EventStreamProvider<TransitionEvent> transitionEndEvent =
       const _CustomEventStreamProvider<TransitionEvent>(
@@ -9326,6 +9886,17 @@
     return false;
   }
 
+  /**
+   * Creates a new shadow root for this shadow host.
+   *
+   * ## Other resources
+   *
+   * * [Shadow DOM 101]
+   * (http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom/)
+   * from HTML5Rocks.
+   * * [Shadow DOM specification]
+   * (http://www.w3.org/TR/shadow-dom/) from W3C.
+   */
   @DomName('Element.createShadowRoot')
   @SupportedBrowser(SupportedBrowser.CHROME, '25')
   @Experimental()
@@ -9335,6 +9906,17 @@
       this, this, this);
   }
 
+  /**
+   * The shadow root of this shadow host.
+   *
+   * ## Other resources
+   *
+   * * [Shadow DOM 101]
+   * (http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom/)
+   * from HTML5Rocks.
+   * * [Shadow DOM specification]
+   * (http://www.w3.org/TR/shadow-dom/) from W3C.
+   */
   @DomName('Element.shadowRoot')
   @SupportedBrowser(SupportedBrowser.CHROME, '25')
   @Experimental()
@@ -9589,207 +10171,547 @@
   // To suppress missing implicit constructor warnings.
   factory Element._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
 
+  /**
+   * Static factory designed to expose `beforecopy` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.beforecopyEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforeCopyEvent = const EventStreamProvider<Event>('beforecopy');
 
+  /**
+   * Static factory designed to expose `beforecut` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.beforecutEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforeCutEvent = const EventStreamProvider<Event>('beforecut');
 
+  /**
+   * Static factory designed to expose `beforepaste` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.beforepasteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforePasteEvent = const EventStreamProvider<Event>('beforepaste');
 
+  /**
+   * Static factory designed to expose `blur` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.blurEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
 
+  /**
+   * Static factory designed to expose `change` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.changeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
 
+  /**
+   * Static factory designed to expose `click` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.clickEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> clickEvent = const EventStreamProvider<MouseEvent>('click');
 
+  /**
+   * Static factory designed to expose `contextmenu` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.contextmenuEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> contextMenuEvent = const EventStreamProvider<MouseEvent>('contextmenu');
 
+  /**
+   * Static factory designed to expose `copy` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.copyEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> copyEvent = const EventStreamProvider<Event>('copy');
 
+  /**
+   * Static factory designed to expose `cut` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.cutEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> cutEvent = const EventStreamProvider<Event>('cut');
 
+  /**
+   * Static factory designed to expose `doubleclick` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.dblclickEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> doubleClickEvent = const EventStreamProvider<Event>('dblclick');
 
+  /**
+   * A stream of `drag` events fired when an element is currently being dragged.
+   *
+   * A `drag` event is added to this stream as soon as the drag begins.
+   * A `drag` event is also added to this stream at intervals while the drag
+   * operation is still ongoing.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEvent = const EventStreamProvider<MouseEvent>('drag');
 
+  /**
+   * A stream of `dragend` events fired when an element completes a drag
+   * operation.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragendEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEndEvent = const EventStreamProvider<MouseEvent>('dragend');
 
+  /**
+   * A stream of `dragenter` events fired when a dragged object is first dragged
+   * over an element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragenterEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEnterEvent = const EventStreamProvider<MouseEvent>('dragenter');
 
+  /**
+   * A stream of `dragleave` events fired when an object being dragged over an
+   * element leaves the element's target area.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragleaveEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragLeaveEvent = const EventStreamProvider<MouseEvent>('dragleave');
 
+  /**
+   * A stream of `dragover` events fired when a dragged object is currently
+   * being dragged over an element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragoverEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragOverEvent = const EventStreamProvider<MouseEvent>('dragover');
 
+  /**
+   * A stream of `dragstart` events for a dragged element whose drag has begun.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragstartEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragStartEvent = const EventStreamProvider<MouseEvent>('dragstart');
 
+  /**
+   * A stream of `drop` events fired when a dragged object is dropped on an
+   * element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dropEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dropEvent = const EventStreamProvider<MouseEvent>('drop');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `focus` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.focusEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
 
+  /**
+   * Static factory designed to expose `input` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.inputEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> inputEvent = const EventStreamProvider<Event>('input');
 
+  /**
+   * Static factory designed to expose `invalid` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.invalidEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> invalidEvent = const EventStreamProvider<Event>('invalid');
 
+  /**
+   * Static factory designed to expose `keydown` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.keydownEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyDownEvent = const EventStreamProvider<KeyboardEvent>('keydown');
 
+  /**
+   * Static factory designed to expose `keypress` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.keypressEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyPressEvent = const EventStreamProvider<KeyboardEvent>('keypress');
 
+  /**
+   * Static factory designed to expose `keyup` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.keyupEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyUpEvent = const EventStreamProvider<KeyboardEvent>('keyup');
 
+  /**
+   * Static factory designed to expose `load` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.loadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
 
+  /**
+   * Static factory designed to expose `mousedown` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mousedownEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseDownEvent = const EventStreamProvider<MouseEvent>('mousedown');
 
+  /**
+   * Static factory designed to expose `mouseenter` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseenterEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseEnterEvent = const EventStreamProvider<MouseEvent>('mouseenter');
 
+  /**
+   * Static factory designed to expose `mouseleave` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseleaveEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseLeaveEvent = const EventStreamProvider<MouseEvent>('mouseleave');
 
+  /**
+   * Static factory designed to expose `mousemove` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mousemoveEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseMoveEvent = const EventStreamProvider<MouseEvent>('mousemove');
 
+  /**
+   * Static factory designed to expose `mouseout` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseoutEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseOutEvent = const EventStreamProvider<MouseEvent>('mouseout');
 
+  /**
+   * Static factory designed to expose `mouseover` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseoverEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseOverEvent = const EventStreamProvider<MouseEvent>('mouseover');
 
+  /**
+   * Static factory designed to expose `mouseup` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseupEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseUpEvent = const EventStreamProvider<MouseEvent>('mouseup');
 
+  /**
+   * Static factory designed to expose `paste` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.pasteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pasteEvent = const EventStreamProvider<Event>('paste');
 
+  /**
+   * Static factory designed to expose `reset` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.resetEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> resetEvent = const EventStreamProvider<Event>('reset');
 
+  /**
+   * Static factory designed to expose `scroll` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.scrollEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> scrollEvent = const EventStreamProvider<Event>('scroll');
 
+  /**
+   * Static factory designed to expose `search` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.searchEvent')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');
 
+  /**
+   * Static factory designed to expose `select` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.selectEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> selectEvent = const EventStreamProvider<Event>('select');
 
+  /**
+   * Static factory designed to expose `selectstart` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.selectstartEvent')
   @DocsEditable()
   @Experimental() // nonstandard
   static const EventStreamProvider<Event> selectStartEvent = const EventStreamProvider<Event>('selectstart');
 
+  /**
+   * Static factory designed to expose `submit` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.submitEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> submitEvent = const EventStreamProvider<Event>('submit');
 
+  /**
+   * Static factory designed to expose `touchcancel` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchcancelEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchCancelEvent = const EventStreamProvider<TouchEvent>('touchcancel');
 
+  /**
+   * Static factory designed to expose `touchend` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchendEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchEndEvent = const EventStreamProvider<TouchEvent>('touchend');
 
+  /**
+   * Static factory designed to expose `touchenter` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchenterEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchEnterEvent = const EventStreamProvider<TouchEvent>('touchenter');
 
+  /**
+   * Static factory designed to expose `touchleave` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchleaveEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchLeaveEvent = const EventStreamProvider<TouchEvent>('touchleave');
 
+  /**
+   * Static factory designed to expose `touchmove` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchmoveEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchMoveEvent = const EventStreamProvider<TouchEvent>('touchmove');
 
+  /**
+   * Static factory designed to expose `touchstart` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchstartEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchStartEvent = const EventStreamProvider<TouchEvent>('touchstart');
 
+  /**
+   * Static factory designed to expose `fullscreenchange` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.webkitfullscreenchangeEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -9798,6 +10720,12 @@
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   static const EventStreamProvider<Event> fullscreenChangeEvent = const EventStreamProvider<Event>('webkitfullscreenchange');
 
+  /**
+   * Static factory designed to expose `fullscreenerror` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.webkitfullscreenerrorEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -9814,10 +10742,32 @@
   @DocsEditable()
   String dir;
 
+  /**
+   * Indicates whether the element can be dragged and dropped.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.draggable')
   @DocsEditable()
   bool draggable;
 
+  /**
+   * Indicates whether the element is not relevant to the page's current state.
+   *
+   * ## Other resources
+   *
+   * * [Hidden attribute specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#the-hidden-attribute)
+   * from WHATWG.
+   */
   @DomName('Element.hidden')
   @DocsEditable()
   bool hidden;
@@ -9827,6 +10777,14 @@
   @DocsEditable()
   String _innerHtml;
 
+  /**
+   * The current state of IME composition.
+   *
+   * ## Other resources
+   *
+   * * [Input method editor specification]
+   * (http://www.w3.org/TR/ime-api/) from W3C.
+   */
   @DomName('Element.inputMethodContext')
   @DocsEditable()
   @Experimental() // untriaged
@@ -9859,6 +10817,16 @@
   @DocsEditable()
   String title;
 
+  /**
+   * Specifies whether this element's text content changes when the page is
+   * localized.
+   *
+   * ## Other resources
+   *
+   * * [The translate attribute]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#the-translate-attribute)
+   * from WHATWG.
+   */
   @DomName('Element.translate')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#the-translate-attribute
@@ -9866,6 +10834,20 @@
   bool translate;
 
   @JSName('webkitdropzone')
+  /**
+   * A set of space-separated keywords that specify what kind of data this
+   * Element accepts on drop and what to do with that data.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.webkitdropzone')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -9933,6 +10915,19 @@
   @DocsEditable()
   final int offsetWidth;
 
+  /**
+   * The name of this element's custom pseudo-element.
+   *
+   * This value must begin with an x and a hyphen, `x-`, to be considered valid.
+   *
+   * ## Other resources
+   *
+   * * [Using custom pseudo elements]
+   * (http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom-201/#toc-custom-pseduo)
+   * from HTML5Rocks.
+   * * [Custom pseudo-elements]
+   * (http://www.w3.org/TR/shadow-dom/#custom-pseudo-elements) from W3C.
+   */
   @DomName('Element.pseudo')
   @DocsEditable()
   @Experimental() // untriaged
@@ -9963,6 +10958,22 @@
   final String tagName;
 
   @JSName('webkitRegionOverset')
+  /**
+   * The current state of this region.
+   *
+   * If `"empty"`, then there is no content in this region.
+   * If `"fit"`, then content fits into this region, and more content can be
+   * added. If `"overset"`, then there is more content than can be fit into this
+   * region.
+   *
+   * ## Other resources
+   *
+   * * [CSS regions and exclusions tutorial]
+   * (http://www.html5rocks.com/en/tutorials/regions/adobe/) from HTML5Rocks.
+   * * [Regions](http://html.adobe.com/webplatform/layout/regions/) from Adobe.
+   * * [CSS regions specification]
+   * (http://www.w3.org/TR/css3-regions/) from W3C.
+   */
   @DomName('Element.webkitRegionOverset')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -9989,10 +11000,33 @@
   @Experimental() // untriaged
   String getAttributeNS(String namespaceURI, String localName) native;
 
+  /**
+   * The smallest bounding rectangle that encompasses this element's padding,
+   * scrollbar, and border.
+   *
+   * ## Other resources
+   *
+   * * [Element.getBoundingClientRect]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect)
+   * from MDN.
+   * * [The getBoundingClientRect() method]
+   * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods) from W3C.
+   */
   @DomName('Element.getBoundingClientRect')
   @DocsEditable()
   Rectangle getBoundingClientRect() native;
 
+  /**
+   * A list of bounding rectangles for each box associated with this element.
+   *
+   * ## Other resources
+   *
+   * * [Element.getClientRects]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Element.getClientRects)
+   * from MDN.
+   * * [The getClientRects() method]
+   * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods) from W3C.
+   */
   @DomName('Element.getClientRects')
   @DocsEditable()
   @Returns('_ClientRectList')
@@ -10156,213 +11190,355 @@
   @DocsEditable()
   final Element _lastElementChild;
 
+  /// Stream of `abort` events handled by this [Element].
   @DomName('Element.onabort')
   @DocsEditable()
   ElementStream<Event> get onAbort => abortEvent.forElement(this);
 
+  /// Stream of `beforecopy` events handled by this [Element].
   @DomName('Element.onbeforecopy')
   @DocsEditable()
   ElementStream<Event> get onBeforeCopy => beforeCopyEvent.forElement(this);
 
+  /// Stream of `beforecut` events handled by this [Element].
   @DomName('Element.onbeforecut')
   @DocsEditable()
   ElementStream<Event> get onBeforeCut => beforeCutEvent.forElement(this);
 
+  /// Stream of `beforepaste` events handled by this [Element].
   @DomName('Element.onbeforepaste')
   @DocsEditable()
   ElementStream<Event> get onBeforePaste => beforePasteEvent.forElement(this);
 
+  /// Stream of `blur` events handled by this [Element].
   @DomName('Element.onblur')
   @DocsEditable()
   ElementStream<Event> get onBlur => blurEvent.forElement(this);
 
+  /// Stream of `change` events handled by this [Element].
   @DomName('Element.onchange')
   @DocsEditable()
   ElementStream<Event> get onChange => changeEvent.forElement(this);
 
+  /// Stream of `click` events handled by this [Element].
   @DomName('Element.onclick')
   @DocsEditable()
   ElementStream<MouseEvent> get onClick => clickEvent.forElement(this);
 
+  /// Stream of `contextmenu` events handled by this [Element].
   @DomName('Element.oncontextmenu')
   @DocsEditable()
   ElementStream<MouseEvent> get onContextMenu => contextMenuEvent.forElement(this);
 
+  /// Stream of `copy` events handled by this [Element].
   @DomName('Element.oncopy')
   @DocsEditable()
   ElementStream<Event> get onCopy => copyEvent.forElement(this);
 
+  /// Stream of `cut` events handled by this [Element].
   @DomName('Element.oncut')
   @DocsEditable()
   ElementStream<Event> get onCut => cutEvent.forElement(this);
 
+  /// Stream of `doubleclick` events handled by this [Element].
   @DomName('Element.ondblclick')
   @DocsEditable()
   ElementStream<Event> get onDoubleClick => doubleClickEvent.forElement(this);
 
+  /**
+   * A stream of `drag` events fired when this element currently being dragged.
+   *
+   * A `drag` event is added to this stream as soon as the drag begins.
+   * A `drag` event is also added to this stream at intervals while the drag
+   * operation is still ongoing.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrag')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrag => dragEvent.forElement(this);
 
+  /**
+   * A stream of `dragend` events fired when this element completes a drag
+   * operation.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragend')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnd => dragEndEvent.forElement(this);
 
+  /**
+   * A stream of `dragenter` events fired when a dragged object is first dragged
+   * over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragenter')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnter => dragEnterEvent.forElement(this);
 
+  /**
+   * A stream of `dragleave` events fired when an object being dragged over this
+   * element leaves this element's target area.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragleave')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragLeave => dragLeaveEvent.forElement(this);
 
+  /**
+   * A stream of `dragover` events fired when a dragged object is currently
+   * being dragged over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragover')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragOver => dragOverEvent.forElement(this);
 
+  /**
+   * A stream of `dragstart` events fired when this element starts being
+   * dragged.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragstart')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragStart => dragStartEvent.forElement(this);
 
+  /**
+   * A stream of `drop` events fired when a dragged object is dropped on this
+   * element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrop')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrop => dropEvent.forElement(this);
 
+  /// Stream of `error` events handled by this [Element].
   @DomName('Element.onerror')
   @DocsEditable()
   ElementStream<Event> get onError => errorEvent.forElement(this);
 
+  /// Stream of `focus` events handled by this [Element].
   @DomName('Element.onfocus')
   @DocsEditable()
   ElementStream<Event> get onFocus => focusEvent.forElement(this);
 
+  /// Stream of `input` events handled by this [Element].
   @DomName('Element.oninput')
   @DocsEditable()
   ElementStream<Event> get onInput => inputEvent.forElement(this);
 
+  /// Stream of `invalid` events handled by this [Element].
   @DomName('Element.oninvalid')
   @DocsEditable()
   ElementStream<Event> get onInvalid => invalidEvent.forElement(this);
 
+  /// Stream of `keydown` events handled by this [Element].
   @DomName('Element.onkeydown')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyDown => keyDownEvent.forElement(this);
 
+  /// Stream of `keypress` events handled by this [Element].
   @DomName('Element.onkeypress')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyPress => keyPressEvent.forElement(this);
 
+  /// Stream of `keyup` events handled by this [Element].
   @DomName('Element.onkeyup')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyUp => keyUpEvent.forElement(this);
 
+  /// Stream of `load` events handled by this [Element].
   @DomName('Element.onload')
   @DocsEditable()
   ElementStream<Event> get onLoad => loadEvent.forElement(this);
 
+  /// Stream of `mousedown` events handled by this [Element].
   @DomName('Element.onmousedown')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseDown => mouseDownEvent.forElement(this);
 
+  /// Stream of `mouseenter` events handled by this [Element].
   @DomName('Element.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseEnter => mouseEnterEvent.forElement(this);
 
+  /// Stream of `mouseleave` events handled by this [Element].
   @DomName('Element.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseLeave => mouseLeaveEvent.forElement(this);
 
+  /// Stream of `mousemove` events handled by this [Element].
   @DomName('Element.onmousemove')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseMove => mouseMoveEvent.forElement(this);
 
+  /// Stream of `mouseout` events handled by this [Element].
   @DomName('Element.onmouseout')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOut => mouseOutEvent.forElement(this);
 
+  /// Stream of `mouseover` events handled by this [Element].
   @DomName('Element.onmouseover')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOver => mouseOverEvent.forElement(this);
 
+  /// Stream of `mouseup` events handled by this [Element].
   @DomName('Element.onmouseup')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseUp => mouseUpEvent.forElement(this);
 
+  /// Stream of `mousewheel` events handled by this [Element].
   @DomName('Element.onmousewheel')
   @DocsEditable()
   // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
   @Experimental() // non-standard
   ElementStream<WheelEvent> get onMouseWheel => mouseWheelEvent.forElement(this);
 
+  /// Stream of `paste` events handled by this [Element].
   @DomName('Element.onpaste')
   @DocsEditable()
   ElementStream<Event> get onPaste => pasteEvent.forElement(this);
 
+  /// Stream of `reset` events handled by this [Element].
   @DomName('Element.onreset')
   @DocsEditable()
   ElementStream<Event> get onReset => resetEvent.forElement(this);
 
+  /// Stream of `scroll` events handled by this [Element].
   @DomName('Element.onscroll')
   @DocsEditable()
   ElementStream<Event> get onScroll => scrollEvent.forElement(this);
 
+  /// Stream of `search` events handled by this [Element].
   @DomName('Element.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   ElementStream<Event> get onSearch => searchEvent.forElement(this);
 
+  /// Stream of `select` events handled by this [Element].
   @DomName('Element.onselect')
   @DocsEditable()
   ElementStream<Event> get onSelect => selectEvent.forElement(this);
 
+  /// Stream of `selectstart` events handled by this [Element].
   @DomName('Element.onselectstart')
   @DocsEditable()
   @Experimental() // nonstandard
   ElementStream<Event> get onSelectStart => selectStartEvent.forElement(this);
 
+  /// Stream of `submit` events handled by this [Element].
   @DomName('Element.onsubmit')
   @DocsEditable()
   ElementStream<Event> get onSubmit => submitEvent.forElement(this);
 
+  /// Stream of `touchcancel` events handled by this [Element].
   @DomName('Element.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchCancel => touchCancelEvent.forElement(this);
 
+  /// Stream of `touchend` events handled by this [Element].
   @DomName('Element.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnd => touchEndEvent.forElement(this);
 
+  /// Stream of `touchenter` events handled by this [Element].
   @DomName('Element.ontouchenter')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnter => touchEnterEvent.forElement(this);
 
+  /// Stream of `touchleave` events handled by this [Element].
   @DomName('Element.ontouchleave')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchLeave => touchLeaveEvent.forElement(this);
 
+  /// Stream of `touchmove` events handled by this [Element].
   @DomName('Element.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchMove => touchMoveEvent.forElement(this);
 
+  /// Stream of `touchstart` events handled by this [Element].
   @DomName('Element.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchStart => touchStartEvent.forElement(this);
 
+  /// Stream of `transitionend` events handled by this [Element].
   @DomName('Element.ontransitionend')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -10371,12 +11547,14 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   ElementStream<TransitionEvent> get onTransitionEnd => transitionEndEvent.forElement(this);
 
+  /// Stream of `fullscreenchange` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
   ElementStream<Event> get onFullscreenChange => fullscreenChangeEvent.forElement(this);
 
+  /// Stream of `fullscreenerror` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
@@ -10834,14 +12012,32 @@
   // To suppress missing implicit constructor warnings.
   factory EventSource._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [EventSource].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('EventSource.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [EventSource].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('EventSource.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+  /**
+   * Static factory designed to expose `open` events to event
+   * handlers that are not necessarily instances of [EventSource].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('EventSource.openEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
@@ -10885,14 +12081,17 @@
   @DocsEditable()
   void close() native;
 
+  /// Stream of `error` events handled by this [EventSource].
   @DomName('EventSource.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `message` events handled by this [EventSource].
   @DomName('EventSource.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
+  /// Stream of `open` events handled by this [EventSource].
   @DomName('EventSource.onopen')
   @DocsEditable()
   Stream<Event> get onOpen => openEvent.forTarget(this);
@@ -11306,26 +12505,62 @@
   // To suppress missing implicit constructor warnings.
   factory FileReader._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `load` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.loadEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> loadEvent = const EventStreamProvider<ProgressEvent>('load');
 
+  /**
+   * Static factory designed to expose `loadend` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.loadendEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> loadEndEvent = const EventStreamProvider<ProgressEvent>('loadend');
 
+  /**
+   * Static factory designed to expose `loadstart` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.loadstartEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> loadStartEvent = const EventStreamProvider<ProgressEvent>('loadstart');
 
+  /**
+   * Static factory designed to expose `progress` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.progressEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
@@ -11379,26 +12614,32 @@
   @DocsEditable()
   void readAsText(Blob blob, [String encoding]) native;
 
+  /// Stream of `abort` events handled by this [FileReader].
   @DomName('FileReader.onabort')
   @DocsEditable()
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [FileReader].
   @DomName('FileReader.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `load` events handled by this [FileReader].
   @DomName('FileReader.onload')
   @DocsEditable()
   Stream<ProgressEvent> get onLoad => loadEvent.forTarget(this);
 
+  /// Stream of `loadend` events handled by this [FileReader].
   @DomName('FileReader.onloadend')
   @DocsEditable()
   Stream<ProgressEvent> get onLoadEnd => loadEndEvent.forTarget(this);
 
+  /// Stream of `loadstart` events handled by this [FileReader].
   @DomName('FileReader.onloadstart')
   @DocsEditable()
   Stream<ProgressEvent> get onLoadStart => loadStartEvent.forTarget(this);
 
+  /// Stream of `progress` events handled by this [FileReader].
   @DomName('FileReader.onprogress')
   @DocsEditable()
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
@@ -11469,26 +12710,62 @@
   // To suppress missing implicit constructor warnings.
   factory FileWriter._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `progress` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.progressEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
 
+  /**
+   * Static factory designed to expose `write` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.writeEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> writeEvent = const EventStreamProvider<ProgressEvent>('write');
 
+  /**
+   * Static factory designed to expose `writeend` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.writeendEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> writeEndEvent = const EventStreamProvider<ProgressEvent>('writeend');
 
+  /**
+   * Static factory designed to expose `writestart` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.writestartEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> writeStartEvent = const EventStreamProvider<ProgressEvent>('writestart');
@@ -11537,26 +12814,32 @@
   @DocsEditable()
   void write(Blob data) native;
 
+  /// Stream of `abort` events handled by this [FileWriter].
   @DomName('FileWriter.onabort')
   @DocsEditable()
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [FileWriter].
   @DomName('FileWriter.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `progress` events handled by this [FileWriter].
   @DomName('FileWriter.onprogress')
   @DocsEditable()
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
 
+  /// Stream of `write` events handled by this [FileWriter].
   @DomName('FileWriter.onwrite')
   @DocsEditable()
   Stream<ProgressEvent> get onWrite => writeEvent.forTarget(this);
 
+  /// Stream of `writeend` events handled by this [FileWriter].
   @DomName('FileWriter.onwriteend')
   @DocsEditable()
   Stream<ProgressEvent> get onWriteEnd => writeEndEvent.forTarget(this);
 
+  /// Stream of `writestart` events handled by this [FileWriter].
   @DomName('FileWriter.onwritestart')
   @DocsEditable()
   Stream<ProgressEvent> get onWriteStart => writeStartEvent.forTarget(this);
@@ -11727,12 +13010,24 @@
   // To suppress missing implicit constructor warnings.
   factory FormElement._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `autocomplete` events to event
+   * handlers that are not necessarily instances of [FormElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLFormElement.autocompleteEvent')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
   @Experimental()
   static const EventStreamProvider<Event> autocompleteEvent = const EventStreamProvider<Event>('autocomplete');
 
+  /**
+   * Static factory designed to expose `autocompleteerror` events to event
+   * handlers that are not necessarily instances of [FormElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLFormElement.autocompleteerrorEvent')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
@@ -11813,12 +13108,14 @@
   @DocsEditable()
   void submit() native;
 
+  /// Stream of `autocomplete` events handled by this [FormElement].
   @DomName('HTMLFormElement.onautocomplete')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
   @Experimental()
   ElementStream<Event> get onAutocomplete => autocompleteEvent.forElement(this);
 
+  /// Stream of `autocompleteerror` events handled by this [FormElement].
   @DomName('HTMLFormElement.onautocompleteerror')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
@@ -12519,6 +13816,12 @@
         extendsTag);
   }
 
+  /**
+   * Static factory designed to expose `visibilitychange` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.visibilityChange')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
@@ -12910,6 +14213,12 @@
   // To suppress missing implicit constructor warnings.
   factory HttpRequest._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `readystatechange` events to event
+   * handlers that are not necessarily instances of [HttpRequest].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequest.readystatechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> readyStateChangeEvent = const EventStreamProvider<ProgressEvent>('readystatechange');
@@ -13188,7 +14497,8 @@
   @DocsEditable()
   void setRequestHeader(String header, String value) native;
 
-  /**
+  /// Stream of `readystatechange` events handled by this [HttpRequest].
+/**
    * Event listeners to be notified every time the [HttpRequest]
    * object's `readyState` changes values.
    */
@@ -13209,56 +14519,102 @@
   // To suppress missing implicit constructor warnings.
   factory HttpRequestEventTarget._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.abortEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.errorEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> errorEvent = const EventStreamProvider<ProgressEvent>('error');
 
+  /**
+   * Static factory designed to expose `load` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.loadEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> loadEvent = const EventStreamProvider<ProgressEvent>('load');
 
+  /**
+   * Static factory designed to expose `loadend` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.loadendEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> loadEndEvent = const EventStreamProvider<ProgressEvent>('loadend');
 
+  /**
+   * Static factory designed to expose `loadstart` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.loadstartEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> loadStartEvent = const EventStreamProvider<ProgressEvent>('loadstart');
 
+  /**
+   * Static factory designed to expose `progress` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.progressEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
 
+  /**
+   * Static factory designed to expose `timeout` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.timeoutEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> timeoutEvent = const EventStreamProvider<ProgressEvent>('timeout');
 
+  /// Stream of `abort` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onabort')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onerror')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<ProgressEvent> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `load` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onload')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<ProgressEvent> get onLoad => loadEvent.forTarget(this);
 
+  /// Stream of `loadend` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onloadend')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -13268,11 +14624,13 @@
   @Experimental() // untriaged
   Stream<ProgressEvent> get onLoadEnd => loadEndEvent.forTarget(this);
 
+  /// Stream of `loadstart` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onloadstart')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<ProgressEvent> get onLoadStart => loadStartEvent.forTarget(this);
 
+  /// Stream of `progress` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onprogress')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -13282,6 +14640,7 @@
   @Experimental() // untriaged
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
 
+  /// Stream of `timeout` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.ontimeout')
   @DocsEditable()
   @Experimental() // untriaged
@@ -13522,6 +14881,12 @@
   // To suppress missing implicit constructor warnings.
   factory InputElement._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `speechchange` events to event
+   * handlers that are not necessarily instances of [InputElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLInputElement.webkitSpeechChangeEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -13801,6 +15166,7 @@
   @DocsEditable()
   void stepUp([int n]) native;
 
+  /// Stream of `speechchange` events handled by this [InputElement].
   @DomName('HTMLInputElement.onwebkitSpeechChange')
   @DocsEditable()
   // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#extending_html_elements
@@ -14994,92 +16360,224 @@
   // To suppress missing implicit constructor warnings.
   factory MediaElement._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `canplay` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.canplayEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> canPlayEvent = const EventStreamProvider<Event>('canplay');
 
+  /**
+   * Static factory designed to expose `canplaythrough` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.canplaythroughEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> canPlayThroughEvent = const EventStreamProvider<Event>('canplaythrough');
 
+  /**
+   * Static factory designed to expose `durationchange` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.durationchangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> durationChangeEvent = const EventStreamProvider<Event>('durationchange');
 
+  /**
+   * Static factory designed to expose `emptied` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.emptiedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> emptiedEvent = const EventStreamProvider<Event>('emptied');
 
+  /**
+   * Static factory designed to expose `ended` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.endedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
 
+  /**
+   * Static factory designed to expose `loadeddata` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.loadeddataEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadedDataEvent = const EventStreamProvider<Event>('loadeddata');
 
+  /**
+   * Static factory designed to expose `loadedmetadata` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.loadedmetadataEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadedMetadataEvent = const EventStreamProvider<Event>('loadedmetadata');
 
+  /**
+   * Static factory designed to expose `loadstart` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.loadstartEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadStartEvent = const EventStreamProvider<Event>('loadstart');
 
+  /**
+   * Static factory designed to expose `pause` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.pauseEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
 
+  /**
+   * Static factory designed to expose `play` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.playEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> playEvent = const EventStreamProvider<Event>('play');
 
+  /**
+   * Static factory designed to expose `playing` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.playingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> playingEvent = const EventStreamProvider<Event>('playing');
 
+  /**
+   * Static factory designed to expose `progress` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.progressEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> progressEvent = const EventStreamProvider<Event>('progress');
 
+  /**
+   * Static factory designed to expose `ratechange` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.ratechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> rateChangeEvent = const EventStreamProvider<Event>('ratechange');
 
+  /**
+   * Static factory designed to expose `seeked` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.seekedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> seekedEvent = const EventStreamProvider<Event>('seeked');
 
+  /**
+   * Static factory designed to expose `seeking` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.seekingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> seekingEvent = const EventStreamProvider<Event>('seeking');
 
+  /**
+   * Static factory designed to expose `show` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.showEvent')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#event-media-loadstart
   @Experimental()
   static const EventStreamProvider<Event> showEvent = const EventStreamProvider<Event>('show');
 
+  /**
+   * Static factory designed to expose `stalled` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.stalledEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> stalledEvent = const EventStreamProvider<Event>('stalled');
 
+  /**
+   * Static factory designed to expose `suspend` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.suspendEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> suspendEvent = const EventStreamProvider<Event>('suspend');
 
+  /**
+   * Static factory designed to expose `timeupdate` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.timeupdateEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> timeUpdateEvent = const EventStreamProvider<Event>('timeupdate');
 
+  /**
+   * Static factory designed to expose `volumechange` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.volumechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> volumeChangeEvent = const EventStreamProvider<Event>('volumechange');
 
+  /**
+   * Static factory designed to expose `waiting` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.waitingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> waitingEvent = const EventStreamProvider<Event>('waiting');
 
+  /**
+   * Static factory designed to expose `keyadded` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.webkitkeyaddedEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -15088,6 +16586,12 @@
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   static const EventStreamProvider<MediaKeyEvent> keyAddedEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyadded');
 
+  /**
+   * Static factory designed to expose `keyerror` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.webkitkeyerrorEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -15096,6 +16600,12 @@
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   static const EventStreamProvider<MediaKeyEvent> keyErrorEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyerror');
 
+  /**
+   * Static factory designed to expose `keymessage` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.webkitkeymessageEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -15104,6 +16614,12 @@
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   static const EventStreamProvider<MediaKeyEvent> keyMessageEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeymessage');
 
+  /**
+   * Static factory designed to expose `needkey` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.webkitneedkeyEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -15368,110 +16884,135 @@
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#extensions
   void generateKeyRequest(String keySystem, [Uint8List initData]) native;
 
+  /// Stream of `canplay` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.oncanplay')
   @DocsEditable()
   ElementStream<Event> get onCanPlay => canPlayEvent.forElement(this);
 
+  /// Stream of `canplaythrough` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.oncanplaythrough')
   @DocsEditable()
   ElementStream<Event> get onCanPlayThrough => canPlayThroughEvent.forElement(this);
 
+  /// Stream of `durationchange` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.ondurationchange')
   @DocsEditable()
   ElementStream<Event> get onDurationChange => durationChangeEvent.forElement(this);
 
+  /// Stream of `emptied` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onemptied')
   @DocsEditable()
   ElementStream<Event> get onEmptied => emptiedEvent.forElement(this);
 
+  /// Stream of `ended` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onended')
   @DocsEditable()
   ElementStream<Event> get onEnded => endedEvent.forElement(this);
 
+  /// Stream of `loadeddata` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onloadeddata')
   @DocsEditable()
   ElementStream<Event> get onLoadedData => loadedDataEvent.forElement(this);
 
+  /// Stream of `loadedmetadata` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onloadedmetadata')
   @DocsEditable()
   ElementStream<Event> get onLoadedMetadata => loadedMetadataEvent.forElement(this);
 
+  /// Stream of `loadstart` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onloadstart')
   @DocsEditable()
   ElementStream<Event> get onLoadStart => loadStartEvent.forElement(this);
 
+  /// Stream of `pause` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onpause')
   @DocsEditable()
   ElementStream<Event> get onPause => pauseEvent.forElement(this);
 
+  /// Stream of `play` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onplay')
   @DocsEditable()
   ElementStream<Event> get onPlay => playEvent.forElement(this);
 
+  /// Stream of `playing` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onplaying')
   @DocsEditable()
   ElementStream<Event> get onPlaying => playingEvent.forElement(this);
 
+  /// Stream of `progress` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onprogress')
   @DocsEditable()
   ElementStream<Event> get onProgress => progressEvent.forElement(this);
 
+  /// Stream of `ratechange` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onratechange')
   @DocsEditable()
   ElementStream<Event> get onRateChange => rateChangeEvent.forElement(this);
 
+  /// Stream of `seeked` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onseeked')
   @DocsEditable()
   ElementStream<Event> get onSeeked => seekedEvent.forElement(this);
 
+  /// Stream of `seeking` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onseeking')
   @DocsEditable()
   ElementStream<Event> get onSeeking => seekingEvent.forElement(this);
 
+  /// Stream of `show` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onshow')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#event-media-loadstart
   @Experimental()
   ElementStream<Event> get onShow => showEvent.forElement(this);
 
+  /// Stream of `stalled` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onstalled')
   @DocsEditable()
   ElementStream<Event> get onStalled => stalledEvent.forElement(this);
 
+  /// Stream of `suspend` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onsuspend')
   @DocsEditable()
   ElementStream<Event> get onSuspend => suspendEvent.forElement(this);
 
+  /// Stream of `timeupdate` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.ontimeupdate')
   @DocsEditable()
   ElementStream<Event> get onTimeUpdate => timeUpdateEvent.forElement(this);
 
+  /// Stream of `volumechange` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onvolumechange')
   @DocsEditable()
   ElementStream<Event> get onVolumeChange => volumeChangeEvent.forElement(this);
 
+  /// Stream of `waiting` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwaiting')
   @DocsEditable()
   ElementStream<Event> get onWaiting => waitingEvent.forElement(this);
 
+  /// Stream of `keyadded` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwebkitkeyadded')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   @Experimental()
   ElementStream<MediaKeyEvent> get onKeyAdded => keyAddedEvent.forElement(this);
 
+  /// Stream of `keyerror` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwebkitkeyerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   @Experimental()
   ElementStream<MediaKeyEvent> get onKeyError => keyErrorEvent.forElement(this);
 
+  /// Stream of `keymessage` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwebkitkeymessage')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   @Experimental()
   ElementStream<MediaKeyEvent> get onKeyMessage => keyMessageEvent.forElement(this);
 
+  /// Stream of `needkey` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwebkitneedkey')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
@@ -15656,6 +17197,12 @@
   // To suppress missing implicit constructor warnings.
   factory MediaKeySession._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `keyadded` events to event
+   * handlers that are not necessarily instances of [MediaKeySession].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaKeySession.webkitkeyaddedEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -15663,6 +17210,12 @@
   @Experimental()
   static const EventStreamProvider<MediaKeyEvent> keyAddedEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyadded');
 
+  /**
+   * Static factory designed to expose `keyerror` events to event
+   * handlers that are not necessarily instances of [MediaKeySession].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaKeySession.webkitkeyerrorEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -15670,6 +17223,12 @@
   @Experimental()
   static const EventStreamProvider<MediaKeyEvent> keyErrorEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyerror');
 
+  /**
+   * Static factory designed to expose `keymessage` events to event
+   * handlers that are not necessarily instances of [MediaKeySession].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaKeySession.webkitkeymessageEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -15697,14 +17256,17 @@
   @DocsEditable()
   void update(Uint8List key) native;
 
+  /// Stream of `keyadded` events handled by this [MediaKeySession].
   @DomName('MediaKeySession.onwebkitkeyadded')
   @DocsEditable()
   Stream<MediaKeyEvent> get onKeyAdded => keyAddedEvent.forTarget(this);
 
+  /// Stream of `keyerror` events handled by this [MediaKeySession].
   @DomName('MediaKeySession.onwebkitkeyerror')
   @DocsEditable()
   Stream<MediaKeyEvent> get onKeyError => keyErrorEvent.forTarget(this);
 
+  /// Stream of `keymessage` events handled by this [MediaKeySession].
   @DomName('MediaKeySession.onwebkitkeymessage')
   @DocsEditable()
   Stream<MediaKeyEvent> get onKeyMessage => keyMessageEvent.forTarget(this);
@@ -15876,14 +17438,32 @@
   // To suppress missing implicit constructor warnings.
   factory MediaStream._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `addtrack` events to event
+   * handlers that are not necessarily instances of [MediaStream].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStream.addtrackEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> addTrackEvent = const EventStreamProvider<Event>('addtrack');
 
+  /**
+   * Static factory designed to expose `ended` events to event
+   * handlers that are not necessarily instances of [MediaStream].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStream.endedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
 
+  /**
+   * Static factory designed to expose `removetrack` events to event
+   * handlers that are not necessarily instances of [MediaStream].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStream.removetrackEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> removeTrackEvent = const EventStreamProvider<Event>('removetrack');
@@ -15947,14 +17527,17 @@
   @DocsEditable()
   void stop() native;
 
+  /// Stream of `addtrack` events handled by this [MediaStream].
   @DomName('MediaStream.onaddtrack')
   @DocsEditable()
   Stream<Event> get onAddTrack => addTrackEvent.forTarget(this);
 
+  /// Stream of `ended` events handled by this [MediaStream].
   @DomName('MediaStream.onended')
   @DocsEditable()
   Stream<Event> get onEnded => endedEvent.forTarget(this);
 
+  /// Stream of `removetrack` events handled by this [MediaStream].
   @DomName('MediaStream.onremovetrack')
   @DocsEditable()
   Stream<Event> get onRemoveTrack => removeTrackEvent.forTarget(this);
@@ -16010,14 +17593,32 @@
   // To suppress missing implicit constructor warnings.
   factory MediaStreamTrack._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `ended` events to event
+   * handlers that are not necessarily instances of [MediaStreamTrack].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStreamTrack.endedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
 
+  /**
+   * Static factory designed to expose `mute` events to event
+   * handlers that are not necessarily instances of [MediaStreamTrack].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStreamTrack.muteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> muteEvent = const EventStreamProvider<Event>('mute');
 
+  /**
+   * Static factory designed to expose `unmute` events to event
+   * handlers that are not necessarily instances of [MediaStreamTrack].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStreamTrack.unmuteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> unmuteEvent = const EventStreamProvider<Event>('unmute');
@@ -16059,14 +17660,17 @@
     return completer.future;
   }
 
+  /// Stream of `ended` events handled by this [MediaStreamTrack].
   @DomName('MediaStreamTrack.onended')
   @DocsEditable()
   Stream<Event> get onEnded => endedEvent.forTarget(this);
 
+  /// Stream of `mute` events handled by this [MediaStreamTrack].
   @DomName('MediaStreamTrack.onmute')
   @DocsEditable()
   Stream<Event> get onMute => muteEvent.forTarget(this);
 
+  /// Stream of `unmute` events handled by this [MediaStreamTrack].
   @DomName('MediaStreamTrack.onunmute')
   @DocsEditable()
   Stream<Event> get onUnmute => unmuteEvent.forTarget(this);
@@ -16248,6 +17852,12 @@
   // To suppress missing implicit constructor warnings.
   factory MessagePort._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [MessagePort].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MessagePort.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
@@ -16281,6 +17891,7 @@
   @DocsEditable()
   void start() native;
 
+  /// Stream of `message` events handled by this [MessagePort].
   @DomName('MessagePort.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
@@ -16427,10 +18038,22 @@
   // To suppress missing implicit constructor warnings.
   factory MidiAccess._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `connect` events to event
+   * handlers that are not necessarily instances of [MidiAccess].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MIDIAccess.connectEvent')
   @DocsEditable()
   static const EventStreamProvider<MidiConnectionEvent> connectEvent = const EventStreamProvider<MidiConnectionEvent>('connect');
 
+  /**
+   * Static factory designed to expose `disconnect` events to event
+   * handlers that are not necessarily instances of [MidiAccess].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MIDIAccess.disconnectEvent')
   @DocsEditable()
   static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
@@ -16443,10 +18066,12 @@
   @DocsEditable()
   List<MidiOutput> outputs() native;
 
+  /// Stream of `connect` events handled by this [MidiAccess].
   @DomName('MIDIAccess.onconnect')
   @DocsEditable()
   Stream<MidiConnectionEvent> get onConnect => connectEvent.forTarget(this);
 
+  /// Stream of `disconnect` events handled by this [MidiAccess].
   @DomName('MIDIAccess.ondisconnect')
   @DocsEditable()
   Stream<MidiConnectionEvent> get onDisconnect => disconnectEvent.forTarget(this);
@@ -16498,10 +18123,17 @@
   // To suppress missing implicit constructor warnings.
   factory MidiInput._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `midimessage` events to event
+   * handlers that are not necessarily instances of [MidiInput].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MIDIInput.midimessageEvent')
   @DocsEditable()
   static const EventStreamProvider<MidiMessageEvent> midiMessageEvent = const EventStreamProvider<MidiMessageEvent>('midimessage');
 
+  /// Stream of `midimessage` events handled by this [MidiInput].
   @DomName('MIDIInput.onmidimessage')
   @DocsEditable()
   Stream<MidiMessageEvent> get onMidiMessage => midiMessageEvent.forTarget(this);
@@ -16557,6 +18189,12 @@
   // To suppress missing implicit constructor warnings.
   factory MidiPort._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `disconnect` events to event
+   * handlers that are not necessarily instances of [MidiPort].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MIDIPort.disconnectEvent')
   @DocsEditable()
   static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
@@ -16581,6 +18219,7 @@
   @DocsEditable()
   final String version;
 
+  /// Stream of `disconnect` events handled by this [MidiPort].
   @DomName('MIDIPort.ondisconnect')
   @DocsEditable()
   Stream<MidiConnectionEvent> get onDisconnect => disconnectEvent.forTarget(this);
@@ -18007,23 +19646,53 @@
   // To suppress missing implicit constructor warnings.
   factory Notification._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `click` events to event
+   * handlers that are not necessarily instances of [Notification].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Notification.clickEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> clickEvent = const EventStreamProvider<Event>('click');
 
+  /**
+   * Static factory designed to expose `close` events to event
+   * handlers that are not necessarily instances of [Notification].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Notification.closeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> closeEvent = const EventStreamProvider<Event>('close');
 
+  /**
+   * Static factory designed to expose `display` events to event
+   * handlers that are not necessarily instances of [Notification].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Notification.displayEvent')
   @DocsEditable()
   @Experimental() // nonstandard
   static const EventStreamProvider<Event> displayEvent = const EventStreamProvider<Event>('display');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Notification].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Notification.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `show` events to event
+   * handlers that are not necessarily instances of [Notification].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Notification.showEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> showEvent = const EventStreamProvider<Event>('show');
@@ -18087,23 +19756,28 @@
   @Experimental() // nonstandard
   void show() native;
 
+  /// Stream of `click` events handled by this [Notification].
   @DomName('Notification.onclick')
   @DocsEditable()
   Stream<Event> get onClick => clickEvent.forTarget(this);
 
+  /// Stream of `close` events handled by this [Notification].
   @DomName('Notification.onclose')
   @DocsEditable()
   Stream<Event> get onClose => closeEvent.forTarget(this);
 
+  /// Stream of `display` events handled by this [Notification].
   @DomName('Notification.ondisplay')
   @DocsEditable()
   @Experimental() // nonstandard
   Stream<Event> get onDisplay => displayEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [Notification].
   @DomName('Notification.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `show` events handled by this [Notification].
   @DomName('Notification.onshow')
   @DocsEditable()
   Stream<Event> get onShow => showEvent.forTarget(this);
@@ -18614,6 +20288,12 @@
   // To suppress missing implicit constructor warnings.
   factory Performance._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `resourcetimingbufferfull` events to event
+   * handlers that are not necessarily instances of [Performance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Performance.webkitresourcetimingbufferfullEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -18702,6 +20382,7 @@
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
   void setResourceTimingBufferSize(int maxSize) native;
 
+  /// Stream of `resourcetimingbufferfull` events handled by this [Performance].
   @DomName('Performance.onwebkitresourcetimingbufferfull')
   @DocsEditable()
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
@@ -19615,18 +21296,42 @@
   // To suppress missing implicit constructor warnings.
   factory RtcDataChannel._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `close` events to event
+   * handlers that are not necessarily instances of [RtcDataChannel].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCDataChannel.closeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> closeEvent = const EventStreamProvider<Event>('close');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [RtcDataChannel].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCDataChannel.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [RtcDataChannel].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCDataChannel.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+  /**
+   * Static factory designed to expose `open` events to event
+   * handlers that are not necessarily instances of [RtcDataChannel].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCDataChannel.openEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
@@ -19709,18 +21414,22 @@
   @DocsEditable()
   void sendTypedData(TypedData data) native;
 
+  /// Stream of `close` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onclose')
   @DocsEditable()
   Stream<Event> get onClose => closeEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `message` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
+  /// Stream of `open` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onopen')
   @DocsEditable()
   Stream<Event> get onOpen => openEvent.forTarget(this);
@@ -19755,6 +21464,12 @@
   // To suppress missing implicit constructor warnings.
   factory RtcDtmfSender._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `tonechange` events to event
+   * handlers that are not necessarily instances of [RtcDtmfSender].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCDTMFSender.tonechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<RtcDtmfToneChangeEvent> toneChangeEvent = const EventStreamProvider<RtcDtmfToneChangeEvent>('tonechange');
@@ -19785,6 +21500,7 @@
   @DocsEditable()
   void insertDtmf(String tones, [int duration, int interToneGap]) native;
 
+  /// Stream of `tonechange` events handled by this [RtcDtmfSender].
   @DomName('RTCDTMFSender.ontonechange')
   @DocsEditable()
   Stream<RtcDtmfToneChangeEvent> get onToneChange => toneChangeEvent.forTarget(this);
@@ -19923,30 +21639,72 @@
   // To suppress missing implicit constructor warnings.
   factory RtcPeerConnection._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `addstream` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.addstreamEvent')
   @DocsEditable()
   static const EventStreamProvider<MediaStreamEvent> addStreamEvent = const EventStreamProvider<MediaStreamEvent>('addstream');
 
+  /**
+   * Static factory designed to expose `datachannel` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.datachannelEvent')
   @DocsEditable()
   static const EventStreamProvider<RtcDataChannelEvent> dataChannelEvent = const EventStreamProvider<RtcDataChannelEvent>('datachannel');
 
+  /**
+   * Static factory designed to expose `icecandidate` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.icecandidateEvent')
   @DocsEditable()
   static const EventStreamProvider<RtcIceCandidateEvent> iceCandidateEvent = const EventStreamProvider<RtcIceCandidateEvent>('icecandidate');
 
+  /**
+   * Static factory designed to expose `iceconnectionstatechange` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.iceconnectionstatechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> iceConnectionStateChangeEvent = const EventStreamProvider<Event>('iceconnectionstatechange');
 
+  /**
+   * Static factory designed to expose `negotiationneeded` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.negotiationneededEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> negotiationNeededEvent = const EventStreamProvider<Event>('negotiationneeded');
 
+  /**
+   * Static factory designed to expose `removestream` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.removestreamEvent')
   @DocsEditable()
   static const EventStreamProvider<MediaStreamEvent> removeStreamEvent = const EventStreamProvider<MediaStreamEvent>('removestream');
 
+  /**
+   * Static factory designed to expose `signalingstatechange` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.signalingstatechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> signalingStateChangeEvent = const EventStreamProvider<Event>('signalingstatechange');
@@ -20145,30 +21903,37 @@
   @DocsEditable()
   void _updateIce_3() native;
 
+  /// Stream of `addstream` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onaddstream')
   @DocsEditable()
   Stream<MediaStreamEvent> get onAddStream => addStreamEvent.forTarget(this);
 
+  /// Stream of `datachannel` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.ondatachannel')
   @DocsEditable()
   Stream<RtcDataChannelEvent> get onDataChannel => dataChannelEvent.forTarget(this);
 
+  /// Stream of `icecandidate` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onicecandidate')
   @DocsEditable()
   Stream<RtcIceCandidateEvent> get onIceCandidate => iceCandidateEvent.forTarget(this);
 
+  /// Stream of `iceconnectionstatechange` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.oniceconnectionstatechange')
   @DocsEditable()
   Stream<Event> get onIceConnectionStateChange => iceConnectionStateChangeEvent.forTarget(this);
 
+  /// Stream of `negotiationneeded` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onnegotiationneeded')
   @DocsEditable()
   Stream<Event> get onNegotiationNeeded => negotiationNeededEvent.forTarget(this);
 
+  /// Stream of `removestream` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onremovestream')
   @DocsEditable()
   Stream<MediaStreamEvent> get onRemoveStream => removeStreamEvent.forTarget(this);
 
+  /// Stream of `signalingstatechange` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onsignalingstatechange')
   @DocsEditable()
   Stream<Event> get onSignalingStateChange => signalingStateChangeEvent.forTarget(this);
@@ -20893,6 +22658,12 @@
   // To suppress missing implicit constructor warnings.
   factory SharedWorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `connect` events to event
+   * handlers that are not necessarily instances of [SharedWorkerGlobalScope].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SharedWorkerGlobalScope.connectEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -20903,6 +22674,7 @@
   @Experimental() // untriaged
   final String name;
 
+  /// Stream of `connect` events handled by this [SharedWorkerGlobalScope].
   @DomName('SharedWorkerGlobalScope.onconnect')
   @DocsEditable()
   @Experimental() // untriaged
@@ -21281,46 +23053,112 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechRecognition._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `audioend` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.audioendEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> audioEndEvent = const EventStreamProvider<Event>('audioend');
 
+  /**
+   * Static factory designed to expose `audiostart` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.audiostartEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> audioStartEvent = const EventStreamProvider<Event>('audiostart');
 
+  /**
+   * Static factory designed to expose `end` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.endEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> endEvent = const EventStreamProvider<Event>('end');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechRecognitionError> errorEvent = const EventStreamProvider<SpeechRecognitionError>('error');
 
+  /**
+   * Static factory designed to expose `nomatch` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.nomatchEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechRecognitionEvent> noMatchEvent = const EventStreamProvider<SpeechRecognitionEvent>('nomatch');
 
+  /**
+   * Static factory designed to expose `result` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.resultEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechRecognitionEvent> resultEvent = const EventStreamProvider<SpeechRecognitionEvent>('result');
 
+  /**
+   * Static factory designed to expose `soundend` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.soundendEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> soundEndEvent = const EventStreamProvider<Event>('soundend');
 
+  /**
+   * Static factory designed to expose `soundstart` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.soundstartEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> soundStartEvent = const EventStreamProvider<Event>('soundstart');
 
+  /**
+   * Static factory designed to expose `speechend` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.speechendEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> speechEndEvent = const EventStreamProvider<Event>('speechend');
 
+  /**
+   * Static factory designed to expose `speechstart` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.speechstartEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> speechStartEvent = const EventStreamProvider<Event>('speechstart');
 
+  /**
+   * Static factory designed to expose `start` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.startEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> startEvent = const EventStreamProvider<Event>('start');
@@ -21360,46 +23198,57 @@
   @DocsEditable()
   void stop() native;
 
+  /// Stream of `audioend` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onaudioend')
   @DocsEditable()
   Stream<Event> get onAudioEnd => audioEndEvent.forTarget(this);
 
+  /// Stream of `audiostart` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onaudiostart')
   @DocsEditable()
   Stream<Event> get onAudioStart => audioStartEvent.forTarget(this);
 
+  /// Stream of `end` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onend')
   @DocsEditable()
   Stream<Event> get onEnd => endEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onerror')
   @DocsEditable()
   Stream<SpeechRecognitionError> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `nomatch` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onnomatch')
   @DocsEditable()
   Stream<SpeechRecognitionEvent> get onNoMatch => noMatchEvent.forTarget(this);
 
+  /// Stream of `result` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onresult')
   @DocsEditable()
   Stream<SpeechRecognitionEvent> get onResult => resultEvent.forTarget(this);
 
+  /// Stream of `soundend` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onsoundend')
   @DocsEditable()
   Stream<Event> get onSoundEnd => soundEndEvent.forTarget(this);
 
+  /// Stream of `soundstart` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onsoundstart')
   @DocsEditable()
   Stream<Event> get onSoundStart => soundStartEvent.forTarget(this);
 
+  /// Stream of `speechend` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onspeechend')
   @DocsEditable()
   Stream<Event> get onSpeechEnd => speechEndEvent.forTarget(this);
 
+  /// Stream of `speechstart` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onspeechstart')
   @DocsEditable()
   Stream<Event> get onSpeechStart => speechStartEvent.forTarget(this);
 
+  /// Stream of `start` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onstart')
   @DocsEditable()
   Stream<Event> get onStart => startEvent.forTarget(this);
@@ -21594,30 +23443,72 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechSynthesisUtterance._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `boundary` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.boundaryEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> boundaryEvent = const EventStreamProvider<SpeechSynthesisEvent>('boundary');
 
+  /**
+   * Static factory designed to expose `end` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.endEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> endEvent = const EventStreamProvider<SpeechSynthesisEvent>('end');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `mark` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.markEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> markEvent = const EventStreamProvider<SpeechSynthesisEvent>('mark');
 
+  /**
+   * Static factory designed to expose `pause` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.pauseEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
 
+  /**
+   * Static factory designed to expose `resume` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.resumeEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> resumeEvent = const EventStreamProvider<SpeechSynthesisEvent>('resume');
 
+  /**
+   * Static factory designed to expose `start` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.startEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> startEvent = const EventStreamProvider<SpeechSynthesisEvent>('start');
@@ -21657,30 +23548,37 @@
   @DocsEditable()
   num volume;
 
+  /// Stream of `boundary` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onboundary')
   @DocsEditable()
   Stream<SpeechSynthesisEvent> get onBoundary => boundaryEvent.forTarget(this);
 
+  /// Stream of `end` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onend')
   @DocsEditable()
   Stream<SpeechSynthesisEvent> get onEnd => endEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `mark` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onmark')
   @DocsEditable()
   Stream<SpeechSynthesisEvent> get onMark => markEvent.forTarget(this);
 
+  /// Stream of `pause` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onpause')
   @DocsEditable()
   Stream<Event> get onPause => pauseEvent.forTarget(this);
 
+  /// Stream of `resume` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onresume')
   @DocsEditable()
   Stream<SpeechSynthesisEvent> get onResume => resumeEvent.forTarget(this);
 
+  /// Stream of `start` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onstart')
   @DocsEditable()
   Stream<SpeechSynthesisEvent> get onStart => startEvent.forTarget(this);
@@ -22755,6 +24653,12 @@
   // To suppress missing implicit constructor warnings.
   factory TextTrack._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `cuechange` events to event
+   * handlers that are not necessarily instances of [TextTrack].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('TextTrack.cuechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> cueChangeEvent = const EventStreamProvider<Event>('cuechange');
@@ -22791,6 +24695,7 @@
   @DocsEditable()
   void removeCue(TextTrackCue cue) native;
 
+  /// Stream of `cuechange` events handled by this [TextTrack].
   @DomName('TextTrack.oncuechange')
   @DocsEditable()
   Stream<Event> get onCueChange => cueChangeEvent.forTarget(this);
@@ -22808,10 +24713,22 @@
   // To suppress missing implicit constructor warnings.
   factory TextTrackCue._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `enter` events to event
+   * handlers that are not necessarily instances of [TextTrackCue].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('TextTrackCue.enterEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> enterEvent = const EventStreamProvider<Event>('enter');
 
+  /**
+   * Static factory designed to expose `exit` events to event
+   * handlers that are not necessarily instances of [TextTrackCue].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('TextTrackCue.exitEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> exitEvent = const EventStreamProvider<Event>('exit');
@@ -22884,10 +24801,12 @@
   @Experimental() // nonstandard
   DocumentFragment getCueAsHtml() native;
 
+  /// Stream of `enter` events handled by this [TextTrackCue].
   @DomName('TextTrackCue.onenter')
   @DocsEditable()
   Stream<Event> get onEnter => enterEvent.forTarget(this);
 
+  /// Stream of `exit` events handled by this [TextTrackCue].
   @DomName('TextTrackCue.onexit')
   @DocsEditable()
   Stream<Event> get onExit => exitEvent.forTarget(this);
@@ -22974,6 +24893,12 @@
   // To suppress missing implicit constructor warnings.
   factory TextTrackList._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `addtrack` events to event
+   * handlers that are not necessarily instances of [TextTrackList].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('TextTrackList.addtrackEvent')
   @DocsEditable()
   static const EventStreamProvider<TrackEvent> addTrackEvent = const EventStreamProvider<TrackEvent>('addtrack');
@@ -23030,6 +24955,7 @@
   @DocsEditable()
   TextTrack item(int index) native;
 
+  /// Stream of `addtrack` events handled by this [TextTrackList].
   @DomName('TextTrackList.onaddtrack')
   @DocsEditable()
   Stream<TrackEvent> get onAddTrack => addTrackEvent.forTarget(this);
@@ -23872,18 +25798,42 @@
   // To suppress missing implicit constructor warnings.
   factory WebSocket._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `close` events to event
+   * handlers that are not necessarily instances of [WebSocket].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('WebSocket.closeEvent')
   @DocsEditable()
   static const EventStreamProvider<CloseEvent> closeEvent = const EventStreamProvider<CloseEvent>('close');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [WebSocket].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('WebSocket.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [WebSocket].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('WebSocket.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+  /**
+   * Static factory designed to expose `open` events to event
+   * handlers that are not necessarily instances of [WebSocket].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('WebSocket.openEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
@@ -24012,18 +25962,22 @@
   @DocsEditable()
   void sendTypedData(TypedData data) native;
 
+  /// Stream of `close` events handled by this [WebSocket].
   @DomName('WebSocket.onclose')
   @DocsEditable()
   Stream<CloseEvent> get onClose => closeEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [WebSocket].
   @DomName('WebSocket.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `message` events handled by this [WebSocket].
   @DomName('WebSocket.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
+  /// Stream of `open` events handled by this [WebSocket].
   @DomName('WebSocket.onopen')
   @DocsEditable()
   Stream<Event> get onOpen => openEvent.forTarget(this);
@@ -24559,62 +26513,146 @@
   // To suppress missing implicit constructor warnings.
   factory Window._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `contentloaded` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.DOMContentLoadedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> contentLoadedEvent = const EventStreamProvider<Event>('DOMContentLoaded');
 
+  /**
+   * Static factory designed to expose `devicemotion` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.devicemotionEvent')
   @DocsEditable()
   // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
   @Experimental()
   static const EventStreamProvider<DeviceMotionEvent> deviceMotionEvent = const EventStreamProvider<DeviceMotionEvent>('devicemotion');
 
+  /**
+   * Static factory designed to expose `deviceorientation` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.deviceorientationEvent')
   @DocsEditable()
   // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
   @Experimental()
   static const EventStreamProvider<DeviceOrientationEvent> deviceOrientationEvent = const EventStreamProvider<DeviceOrientationEvent>('deviceorientation');
 
+  /**
+   * Static factory designed to expose `hashchange` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.hashchangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> hashChangeEvent = const EventStreamProvider<Event>('hashchange');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+  /**
+   * Static factory designed to expose `offline` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.offlineEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> offlineEvent = const EventStreamProvider<Event>('offline');
 
+  /**
+   * Static factory designed to expose `online` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.onlineEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> onlineEvent = const EventStreamProvider<Event>('online');
 
+  /**
+   * Static factory designed to expose `pagehide` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.pagehideEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pageHideEvent = const EventStreamProvider<Event>('pagehide');
 
+  /**
+   * Static factory designed to expose `pageshow` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.pageshowEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pageShowEvent = const EventStreamProvider<Event>('pageshow');
 
+  /**
+   * Static factory designed to expose `popstate` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.popstateEvent')
   @DocsEditable()
   static const EventStreamProvider<PopStateEvent> popStateEvent = const EventStreamProvider<PopStateEvent>('popstate');
 
+  /**
+   * Static factory designed to expose `resize` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.resizeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
 
+  /**
+   * Static factory designed to expose `storage` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.storageEvent')
   @DocsEditable()
   static const EventStreamProvider<StorageEvent> storageEvent = const EventStreamProvider<StorageEvent>('storage');
 
+  /**
+   * Static factory designed to expose `unload` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.unloadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
 
+  /**
+   * Static factory designed to expose `animationend` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.webkitAnimationEndEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -24622,6 +26660,12 @@
   @Experimental()
   static const EventStreamProvider<AnimationEvent> animationEndEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationEnd');
 
+  /**
+   * Static factory designed to expose `animationiteration` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.webkitAnimationIterationEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -24629,6 +26673,12 @@
   @Experimental()
   static const EventStreamProvider<AnimationEvent> animationIterationEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationIteration');
 
+  /**
+   * Static factory designed to expose `animationstart` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.webkitAnimationStartEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -25079,253 +27129,313 @@
   @DocsEditable()
   int _setTimeout(Object handler, int timeout) native;
 
+  /// Stream of `contentloaded` events handled by this [Window].
   @DomName('Window.onDOMContentLoaded')
   @DocsEditable()
   Stream<Event> get onContentLoaded => contentLoadedEvent.forTarget(this);
 
+  /// Stream of `abort` events handled by this [Window].
   @DomName('Window.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => Element.abortEvent.forTarget(this);
 
+  /// Stream of `blur` events handled by this [Window].
   @DomName('Window.onblur')
   @DocsEditable()
   Stream<Event> get onBlur => Element.blurEvent.forTarget(this);
 
+  /// Stream of `change` events handled by this [Window].
   @DomName('Window.onchange')
   @DocsEditable()
   Stream<Event> get onChange => Element.changeEvent.forTarget(this);
 
+  /// Stream of `click` events handled by this [Window].
   @DomName('Window.onclick')
   @DocsEditable()
   Stream<MouseEvent> get onClick => Element.clickEvent.forTarget(this);
 
+  /// Stream of `contextmenu` events handled by this [Window].
   @DomName('Window.oncontextmenu')
   @DocsEditable()
   Stream<MouseEvent> get onContextMenu => Element.contextMenuEvent.forTarget(this);
 
+  /// Stream of `doubleclick` events handled by this [Window].
   @DomName('Window.ondblclick')
   @DocsEditable()
   Stream<Event> get onDoubleClick => Element.doubleClickEvent.forTarget(this);
 
+  /// Stream of `devicemotion` events handled by this [Window].
   @DomName('Window.ondevicemotion')
   @DocsEditable()
   // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
   @Experimental()
   Stream<DeviceMotionEvent> get onDeviceMotion => deviceMotionEvent.forTarget(this);
 
+  /// Stream of `deviceorientation` events handled by this [Window].
   @DomName('Window.ondeviceorientation')
   @DocsEditable()
   // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
   @Experimental()
   Stream<DeviceOrientationEvent> get onDeviceOrientation => deviceOrientationEvent.forTarget(this);
 
+  /// Stream of `drag` events handled by this [Window].
   @DomName('Window.ondrag')
   @DocsEditable()
   Stream<MouseEvent> get onDrag => Element.dragEvent.forTarget(this);
 
+  /// Stream of `dragend` events handled by this [Window].
   @DomName('Window.ondragend')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnd => Element.dragEndEvent.forTarget(this);
 
+  /// Stream of `dragenter` events handled by this [Window].
   @DomName('Window.ondragenter')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnter => Element.dragEnterEvent.forTarget(this);
 
+  /// Stream of `dragleave` events handled by this [Window].
   @DomName('Window.ondragleave')
   @DocsEditable()
   Stream<MouseEvent> get onDragLeave => Element.dragLeaveEvent.forTarget(this);
 
+  /// Stream of `dragover` events handled by this [Window].
   @DomName('Window.ondragover')
   @DocsEditable()
   Stream<MouseEvent> get onDragOver => Element.dragOverEvent.forTarget(this);
 
+  /// Stream of `dragstart` events handled by this [Window].
   @DomName('Window.ondragstart')
   @DocsEditable()
   Stream<MouseEvent> get onDragStart => Element.dragStartEvent.forTarget(this);
 
+  /// Stream of `drop` events handled by this [Window].
   @DomName('Window.ondrop')
   @DocsEditable()
   Stream<MouseEvent> get onDrop => Element.dropEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [Window].
   @DomName('Window.onerror')
   @DocsEditable()
   Stream<Event> get onError => Element.errorEvent.forTarget(this);
 
+  /// Stream of `focus` events handled by this [Window].
   @DomName('Window.onfocus')
   @DocsEditable()
   Stream<Event> get onFocus => Element.focusEvent.forTarget(this);
 
+  /// Stream of `hashchange` events handled by this [Window].
   @DomName('Window.onhashchange')
   @DocsEditable()
   Stream<Event> get onHashChange => hashChangeEvent.forTarget(this);
 
+  /// Stream of `input` events handled by this [Window].
   @DomName('Window.oninput')
   @DocsEditable()
   Stream<Event> get onInput => Element.inputEvent.forTarget(this);
 
+  /// Stream of `invalid` events handled by this [Window].
   @DomName('Window.oninvalid')
   @DocsEditable()
   Stream<Event> get onInvalid => Element.invalidEvent.forTarget(this);
 
+  /// Stream of `keydown` events handled by this [Window].
   @DomName('Window.onkeydown')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyDown => Element.keyDownEvent.forTarget(this);
 
+  /// Stream of `keypress` events handled by this [Window].
   @DomName('Window.onkeypress')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyPress => Element.keyPressEvent.forTarget(this);
 
+  /// Stream of `keyup` events handled by this [Window].
   @DomName('Window.onkeyup')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyUp => Element.keyUpEvent.forTarget(this);
 
+  /// Stream of `load` events handled by this [Window].
   @DomName('Window.onload')
   @DocsEditable()
   Stream<Event> get onLoad => Element.loadEvent.forTarget(this);
 
+  /// Stream of `message` events handled by this [Window].
   @DomName('Window.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
+  /// Stream of `mousedown` events handled by this [Window].
   @DomName('Window.onmousedown')
   @DocsEditable()
   Stream<MouseEvent> get onMouseDown => Element.mouseDownEvent.forTarget(this);
 
+  /// Stream of `mouseenter` events handled by this [Window].
   @DomName('Window.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseEnter => Element.mouseEnterEvent.forTarget(this);
 
+  /// Stream of `mouseleave` events handled by this [Window].
   @DomName('Window.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseLeave => Element.mouseLeaveEvent.forTarget(this);
 
+  /// Stream of `mousemove` events handled by this [Window].
   @DomName('Window.onmousemove')
   @DocsEditable()
   Stream<MouseEvent> get onMouseMove => Element.mouseMoveEvent.forTarget(this);
 
+  /// Stream of `mouseout` events handled by this [Window].
   @DomName('Window.onmouseout')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOut => Element.mouseOutEvent.forTarget(this);
 
+  /// Stream of `mouseover` events handled by this [Window].
   @DomName('Window.onmouseover')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOver => Element.mouseOverEvent.forTarget(this);
 
+  /// Stream of `mouseup` events handled by this [Window].
   @DomName('Window.onmouseup')
   @DocsEditable()
   Stream<MouseEvent> get onMouseUp => Element.mouseUpEvent.forTarget(this);
 
+  /// Stream of `mousewheel` events handled by this [Window].
   @DomName('Window.onmousewheel')
   @DocsEditable()
   Stream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent.forTarget(this);
 
+  /// Stream of `offline` events handled by this [Window].
   @DomName('Window.onoffline')
   @DocsEditable()
   Stream<Event> get onOffline => offlineEvent.forTarget(this);
 
+  /// Stream of `online` events handled by this [Window].
   @DomName('Window.ononline')
   @DocsEditable()
   Stream<Event> get onOnline => onlineEvent.forTarget(this);
 
+  /// Stream of `pagehide` events handled by this [Window].
   @DomName('Window.onpagehide')
   @DocsEditable()
   Stream<Event> get onPageHide => pageHideEvent.forTarget(this);
 
+  /// Stream of `pageshow` events handled by this [Window].
   @DomName('Window.onpageshow')
   @DocsEditable()
   Stream<Event> get onPageShow => pageShowEvent.forTarget(this);
 
+  /// Stream of `popstate` events handled by this [Window].
   @DomName('Window.onpopstate')
   @DocsEditable()
   Stream<PopStateEvent> get onPopState => popStateEvent.forTarget(this);
 
+  /// Stream of `reset` events handled by this [Window].
   @DomName('Window.onreset')
   @DocsEditable()
   Stream<Event> get onReset => Element.resetEvent.forTarget(this);
 
+  /// Stream of `resize` events handled by this [Window].
   @DomName('Window.onresize')
   @DocsEditable()
   Stream<Event> get onResize => resizeEvent.forTarget(this);
 
+  /// Stream of `scroll` events handled by this [Window].
   @DomName('Window.onscroll')
   @DocsEditable()
   Stream<Event> get onScroll => Element.scrollEvent.forTarget(this);
 
+  /// Stream of `search` events handled by this [Window].
   @DomName('Window.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   Stream<Event> get onSearch => Element.searchEvent.forTarget(this);
 
+  /// Stream of `select` events handled by this [Window].
   @DomName('Window.onselect')
   @DocsEditable()
   Stream<Event> get onSelect => Element.selectEvent.forTarget(this);
 
+  /// Stream of `storage` events handled by this [Window].
   @DomName('Window.onstorage')
   @DocsEditable()
   Stream<StorageEvent> get onStorage => storageEvent.forTarget(this);
 
+  /// Stream of `submit` events handled by this [Window].
   @DomName('Window.onsubmit')
   @DocsEditable()
   Stream<Event> get onSubmit => Element.submitEvent.forTarget(this);
 
+  /// Stream of `touchcancel` events handled by this [Window].
   @DomName('Window.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchCancel => Element.touchCancelEvent.forTarget(this);
 
+  /// Stream of `touchend` events handled by this [Window].
   @DomName('Window.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchEnd => Element.touchEndEvent.forTarget(this);
 
+  /// Stream of `touchmove` events handled by this [Window].
   @DomName('Window.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchMove => Element.touchMoveEvent.forTarget(this);
 
+  /// Stream of `touchstart` events handled by this [Window].
   @DomName('Window.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchStart => Element.touchStartEvent.forTarget(this);
 
+  /// Stream of `transitionend` events handled by this [Window].
   @DomName('Window.ontransitionend')
   @DocsEditable()
   Stream<TransitionEvent> get onTransitionEnd => Element.transitionEndEvent.forTarget(this);
 
+  /// Stream of `unload` events handled by this [Window].
   @DomName('Window.onunload')
   @DocsEditable()
   Stream<Event> get onUnload => unloadEvent.forTarget(this);
 
+  /// Stream of `animationend` events handled by this [Window].
   @DomName('Window.onwebkitAnimationEnd')
   @DocsEditable()
   @Experimental()
   Stream<AnimationEvent> get onAnimationEnd => animationEndEvent.forTarget(this);
 
+  /// Stream of `animationiteration` events handled by this [Window].
   @DomName('Window.onwebkitAnimationIteration')
   @DocsEditable()
   @Experimental()
   Stream<AnimationEvent> get onAnimationIteration => animationIterationEvent.forTarget(this);
 
+  /// Stream of `animationstart` events handled by this [Window].
   @DomName('Window.onwebkitAnimationStart')
   @DocsEditable()
   @Experimental()
   Stream<AnimationEvent> get onAnimationStart => animationStartEvent.forTarget(this);
 
 
+  /**
+   * Static factory designed to expose `beforeunload` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.beforeunloadEvent')
-  @DocsEditable()
   static const EventStreamProvider<BeforeUnloadEvent> beforeUnloadEvent =
       const _BeforeUnloadEventStreamProvider('beforeunload');
 
+  /// Stream of `beforeunload` events handled by this [Window].
   @DomName('Window.onbeforeunload')
-  @DocsEditable()
   Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
 
   void moveTo(Point p) {
@@ -25362,8 +27472,9 @@
   const _BeforeUnloadEventStreamProvider(this._eventType);
 
   Stream<BeforeUnloadEvent> forTarget(EventTarget e, {bool useCapture: false}) {
-    var controller = new StreamController(sync: true);
     var stream = new _EventStream(e, _eventType, useCapture);
+    var controller = new StreamController(sync: true);
+
     stream.listen((event) {
       var wrapped = new _BeforeUnloadEvent(event);
       controller.add(wrapped);
@@ -25410,11 +27521,23 @@
   // To suppress missing implicit constructor warnings.
   factory Worker._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Worker].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Worker.errorEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [Worker].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Worker.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
@@ -25437,11 +27560,13 @@
   @DocsEditable()
   void terminate() native;
 
+  /// Stream of `error` events handled by this [Worker].
   @DomName('Worker.onerror')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `message` events handled by this [Worker].
   @DomName('Worker.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
@@ -25489,6 +27614,12 @@
   // To suppress missing implicit constructor warnings.
   factory WorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [WorkerGlobalScope].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('WorkerGlobalScope.errorEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -25651,6 +27782,7 @@
   @Experimental() // untriaged
   int setTimeout(Object handler, int timeout) native;
 
+  /// Stream of `error` events handled by this [WorkerGlobalScope].
   @DomName('WorkerGlobalScope.onerror')
   @DocsEditable()
   @Experimental() // untriaged
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 51bfff9..047cafc 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -55,6 +55,7 @@
 
 
 
+// Issue 14721, order important for WrappedEvent.
 
 
 Window _window;
@@ -122,10 +123,17 @@
   // To suppress missing implicit constructor warnings.
   factory AbstractWorker._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [AbstractWorker].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('AbstractWorker.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<ErrorEvent> errorEvent = const EventStreamProvider<ErrorEvent>('error');
 
+  /// Stream of `error` events handled by this [AbstractWorker].
   @DomName('AbstractWorker.onerror')
   @DocsEditable()
   Stream<ErrorEvent> get onError => errorEvent.forTarget(this);
@@ -370,34 +378,82 @@
   // To suppress missing implicit constructor warnings.
   factory ApplicationCache._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `cached` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.cachedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> cachedEvent = const EventStreamProvider<Event>('cached');
 
+  /**
+   * Static factory designed to expose `checking` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.checkingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> checkingEvent = const EventStreamProvider<Event>('checking');
 
+  /**
+   * Static factory designed to expose `downloading` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.downloadingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> downloadingEvent = const EventStreamProvider<Event>('downloading');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `noupdate` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.noupdateEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> noUpdateEvent = const EventStreamProvider<Event>('noupdate');
 
+  /**
+   * Static factory designed to expose `obsolete` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.obsoleteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> obsoleteEvent = const EventStreamProvider<Event>('obsolete');
 
+  /**
+   * Static factory designed to expose `progress` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.progressEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
 
+  /**
+   * Static factory designed to expose `updateready` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.updatereadyEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> updateReadyEvent = const EventStreamProvider<Event>('updateready');
@@ -457,34 +513,42 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "ApplicationCache_removeEventListener_Callback";
 
+  /// Stream of `cached` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.oncached')
   @DocsEditable()
   Stream<Event> get onCached => cachedEvent.forTarget(this);
 
+  /// Stream of `checking` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onchecking')
   @DocsEditable()
   Stream<Event> get onChecking => checkingEvent.forTarget(this);
 
+  /// Stream of `downloading` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.ondownloading')
   @DocsEditable()
   Stream<Event> get onDownloading => downloadingEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `noupdate` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onnoupdate')
   @DocsEditable()
   Stream<Event> get onNoUpdate => noUpdateEvent.forTarget(this);
 
+  /// Stream of `obsolete` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onobsolete')
   @DocsEditable()
   Stream<Event> get onObsolete => obsoleteEvent.forTarget(this);
 
+  /// Stream of `progress` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onprogress')
   @DocsEditable()
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
 
+  /// Stream of `updateready` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onupdateready')
   @DocsEditable()
   Stream<Event> get onUpdateReady => updateReadyEvent.forTarget(this);
@@ -753,11 +817,18 @@
 
 @DocsEditable()
 @DomName('BeforeUnloadEvent')
-@Experimental() // untriaged
 class BeforeUnloadEvent extends Event {
   // To suppress missing implicit constructor warnings.
   factory BeforeUnloadEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('BeforeUnloadEvent.returnValue')
+  @DocsEditable()
+  String get returnValue native "BeforeUnloadEvent_returnValue_Getter";
+
+  @DomName('BeforeUnloadEvent.returnValue')
+  @DocsEditable()
+  void set returnValue(String value) native "BeforeUnloadEvent_returnValue_Setter";
+
 }
 // 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
@@ -820,50 +891,122 @@
   // To suppress missing implicit constructor warnings.
   factory BodyElement._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `blur` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.blurEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `focus` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.focusEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
 
+  /**
+   * Static factory designed to expose `hashchange` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.hashchangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> hashChangeEvent = const EventStreamProvider<Event>('hashchange');
 
+  /**
+   * Static factory designed to expose `load` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.loadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+  /**
+   * Static factory designed to expose `offline` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.offlineEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> offlineEvent = const EventStreamProvider<Event>('offline');
 
+  /**
+   * Static factory designed to expose `online` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.onlineEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> onlineEvent = const EventStreamProvider<Event>('online');
 
+  /**
+   * Static factory designed to expose `popstate` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.popstateEvent')
   @DocsEditable()
   static const EventStreamProvider<PopStateEvent> popStateEvent = const EventStreamProvider<PopStateEvent>('popstate');
 
+  /**
+   * Static factory designed to expose `resize` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.resizeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
 
+  /**
+   * Static factory designed to expose `storage` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.storageEvent')
   @DocsEditable()
   static const EventStreamProvider<StorageEvent> storageEvent = const EventStreamProvider<StorageEvent>('storage');
 
+  /**
+   * Static factory designed to expose `unload` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.unloadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
@@ -878,50 +1021,62 @@
    */
   BodyElement.created() : super.created();
 
+  /// Stream of `blur` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onblur')
   @DocsEditable()
   ElementStream<Event> get onBlur => blurEvent.forElement(this);
 
+  /// Stream of `error` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onerror')
   @DocsEditable()
   ElementStream<Event> get onError => errorEvent.forElement(this);
 
+  /// Stream of `focus` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onfocus')
   @DocsEditable()
   ElementStream<Event> get onFocus => focusEvent.forElement(this);
 
+  /// Stream of `hashchange` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onhashchange')
   @DocsEditable()
   ElementStream<Event> get onHashChange => hashChangeEvent.forElement(this);
 
+  /// Stream of `load` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onload')
   @DocsEditable()
   ElementStream<Event> get onLoad => loadEvent.forElement(this);
 
+  /// Stream of `message` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onmessage')
   @DocsEditable()
   ElementStream<MessageEvent> get onMessage => messageEvent.forElement(this);
 
+  /// Stream of `offline` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onoffline')
   @DocsEditable()
   ElementStream<Event> get onOffline => offlineEvent.forElement(this);
 
+  /// Stream of `online` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.ononline')
   @DocsEditable()
   ElementStream<Event> get onOnline => onlineEvent.forElement(this);
 
+  /// Stream of `popstate` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onpopstate')
   @DocsEditable()
   ElementStream<PopStateEvent> get onPopState => popStateEvent.forElement(this);
 
+  /// Stream of `resize` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onresize')
   @DocsEditable()
   ElementStream<Event> get onResize => resizeEvent.forElement(this);
 
+  /// Stream of `storage` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onstorage')
   @DocsEditable()
   ElementStream<StorageEvent> get onStorage => storageEvent.forElement(this);
 
+  /// Stream of `unload` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onunload')
   @DocsEditable()
   ElementStream<Event> get onUnload => unloadEvent.forElement(this);
@@ -1110,10 +1265,22 @@
   // To suppress missing implicit constructor warnings.
   factory CanvasElement._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `webglcontextlost` events to event
+   * handlers that are not necessarily instances of [CanvasElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLCanvasElement.webglcontextlostEvent')
   @DocsEditable()
   static const EventStreamProvider<gl.ContextEvent> webGlContextLostEvent = const EventStreamProvider<gl.ContextEvent>('webglcontextlost');
 
+  /**
+   * Static factory designed to expose `webglcontextrestored` events to event
+   * handlers that are not necessarily instances of [CanvasElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLCanvasElement.webglcontextrestoredEvent')
   @DocsEditable()
   static const EventStreamProvider<gl.ContextEvent> webGlContextRestoredEvent = const EventStreamProvider<gl.ContextEvent>('webglcontextrestored');
@@ -1161,10 +1328,12 @@
   @DocsEditable()
   String _toDataUrl(String type, [num quality]) native "HTMLCanvasElement_toDataURL_Callback";
 
+  /// Stream of `webglcontextlost` events handled by this [CanvasElement].
   @DomName('HTMLCanvasElement.onwebglcontextlost')
   @DocsEditable()
   ElementStream<gl.ContextEvent> get onWebGlContextLost => webGlContextLostEvent.forElement(this);
 
+  /// Stream of `webglcontextrestored` events handled by this [CanvasElement].
   @DomName('HTMLCanvasElement.onwebglcontextrestored')
   @DocsEditable()
   ElementStream<gl.ContextEvent> get onWebGlContextRestored => webGlContextRestoredEvent.forElement(this);
@@ -2197,8 +2366,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.
 
-// WARNING: Do not edit - generated code.
-
 
 @DocsEditable()
 @DomName('Comment')
@@ -2214,7 +2381,6 @@
 
   @DocsEditable()
   static Comment _create_1(data) native "Comment__create_1constructorCallback";
-
 }
 // 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
@@ -6771,6 +6937,12 @@
   // To suppress missing implicit constructor warnings.
   factory DedicatedWorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [DedicatedWorkerGlobalScope].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('DedicatedWorkerGlobalScope.messageEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -6781,6 +6953,7 @@
   @Experimental() // untriaged
   void postMessage(Object message, [List messagePorts]) native "DedicatedWorkerGlobalScope_postMessage_Callback";
 
+  /// Stream of `message` events handled by this [DedicatedWorkerGlobalScope].
   @DomName('DedicatedWorkerGlobalScope.onmessage')
   @DocsEditable()
   @Experimental() // untriaged
@@ -7193,20 +7366,44 @@
   // To suppress missing implicit constructor warnings.
   factory Document._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `readystatechange` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.readystatechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> readyStateChangeEvent = const EventStreamProvider<Event>('readystatechange');
 
+  /**
+   * Static factory designed to expose `securitypolicyviolation` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.securitypolicyviolationEvent')
   @DocsEditable()
   // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#widl-Document-onsecuritypolicyviolation
   @Experimental()
   static const EventStreamProvider<SecurityPolicyViolationEvent> securityPolicyViolationEvent = const EventStreamProvider<SecurityPolicyViolationEvent>('securitypolicyviolation');
 
+  /**
+   * Static factory designed to expose `selectionchange` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.selectionchangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> selectionChangeEvent = const EventStreamProvider<Event>('selectionchange');
 
+  /**
+   * Static factory designed to expose `pointerlockchange` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.webkitpointerlockchangeEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -7215,6 +7412,12 @@
   // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-onpointerlockchange
   static const EventStreamProvider<Event> pointerLockChangeEvent = const EventStreamProvider<Event>('webkitpointerlockchange');
 
+  /**
+   * Static factory designed to expose `pointerlockerror` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.webkitpointerlockerrorEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -7558,230 +7761,282 @@
   @DocsEditable()
   Element get _lastElementChild native "Document_lastElementChild_Getter";
 
+  /// Stream of `abort` events handled by this [Document].
   @DomName('Document.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => Element.abortEvent.forTarget(this);
 
+  /// Stream of `beforecopy` events handled by this [Document].
   @DomName('Document.onbeforecopy')
   @DocsEditable()
   Stream<Event> get onBeforeCopy => Element.beforeCopyEvent.forTarget(this);
 
+  /// Stream of `beforecut` events handled by this [Document].
   @DomName('Document.onbeforecut')
   @DocsEditable()
   Stream<Event> get onBeforeCut => Element.beforeCutEvent.forTarget(this);
 
+  /// Stream of `beforepaste` events handled by this [Document].
   @DomName('Document.onbeforepaste')
   @DocsEditable()
   Stream<Event> get onBeforePaste => Element.beforePasteEvent.forTarget(this);
 
+  /// Stream of `blur` events handled by this [Document].
   @DomName('Document.onblur')
   @DocsEditable()
   Stream<Event> get onBlur => Element.blurEvent.forTarget(this);
 
+  /// Stream of `change` events handled by this [Document].
   @DomName('Document.onchange')
   @DocsEditable()
   Stream<Event> get onChange => Element.changeEvent.forTarget(this);
 
+  /// Stream of `click` events handled by this [Document].
   @DomName('Document.onclick')
   @DocsEditable()
   Stream<MouseEvent> get onClick => Element.clickEvent.forTarget(this);
 
+  /// Stream of `contextmenu` events handled by this [Document].
   @DomName('Document.oncontextmenu')
   @DocsEditable()
   Stream<MouseEvent> get onContextMenu => Element.contextMenuEvent.forTarget(this);
 
+  /// Stream of `copy` events handled by this [Document].
   @DomName('Document.oncopy')
   @DocsEditable()
   Stream<Event> get onCopy => Element.copyEvent.forTarget(this);
 
+  /// Stream of `cut` events handled by this [Document].
   @DomName('Document.oncut')
   @DocsEditable()
   Stream<Event> get onCut => Element.cutEvent.forTarget(this);
 
+  /// Stream of `doubleclick` events handled by this [Document].
   @DomName('Document.ondblclick')
   @DocsEditable()
   Stream<Event> get onDoubleClick => Element.doubleClickEvent.forTarget(this);
 
+  /// Stream of `drag` events handled by this [Document].
   @DomName('Document.ondrag')
   @DocsEditable()
   Stream<MouseEvent> get onDrag => Element.dragEvent.forTarget(this);
 
+  /// Stream of `dragend` events handled by this [Document].
   @DomName('Document.ondragend')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnd => Element.dragEndEvent.forTarget(this);
 
+  /// Stream of `dragenter` events handled by this [Document].
   @DomName('Document.ondragenter')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnter => Element.dragEnterEvent.forTarget(this);
 
+  /// Stream of `dragleave` events handled by this [Document].
   @DomName('Document.ondragleave')
   @DocsEditable()
   Stream<MouseEvent> get onDragLeave => Element.dragLeaveEvent.forTarget(this);
 
+  /// Stream of `dragover` events handled by this [Document].
   @DomName('Document.ondragover')
   @DocsEditable()
   Stream<MouseEvent> get onDragOver => Element.dragOverEvent.forTarget(this);
 
+  /// Stream of `dragstart` events handled by this [Document].
   @DomName('Document.ondragstart')
   @DocsEditable()
   Stream<MouseEvent> get onDragStart => Element.dragStartEvent.forTarget(this);
 
+  /// Stream of `drop` events handled by this [Document].
   @DomName('Document.ondrop')
   @DocsEditable()
   Stream<MouseEvent> get onDrop => Element.dropEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [Document].
   @DomName('Document.onerror')
   @DocsEditable()
   Stream<Event> get onError => Element.errorEvent.forTarget(this);
 
+  /// Stream of `focus` events handled by this [Document].
   @DomName('Document.onfocus')
   @DocsEditable()
   Stream<Event> get onFocus => Element.focusEvent.forTarget(this);
 
+  /// Stream of `input` events handled by this [Document].
   @DomName('Document.oninput')
   @DocsEditable()
   Stream<Event> get onInput => Element.inputEvent.forTarget(this);
 
+  /// Stream of `invalid` events handled by this [Document].
   @DomName('Document.oninvalid')
   @DocsEditable()
   Stream<Event> get onInvalid => Element.invalidEvent.forTarget(this);
 
+  /// Stream of `keydown` events handled by this [Document].
   @DomName('Document.onkeydown')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyDown => Element.keyDownEvent.forTarget(this);
 
+  /// Stream of `keypress` events handled by this [Document].
   @DomName('Document.onkeypress')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyPress => Element.keyPressEvent.forTarget(this);
 
+  /// Stream of `keyup` events handled by this [Document].
   @DomName('Document.onkeyup')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyUp => Element.keyUpEvent.forTarget(this);
 
+  /// Stream of `load` events handled by this [Document].
   @DomName('Document.onload')
   @DocsEditable()
   Stream<Event> get onLoad => Element.loadEvent.forTarget(this);
 
+  /// Stream of `mousedown` events handled by this [Document].
   @DomName('Document.onmousedown')
   @DocsEditable()
   Stream<MouseEvent> get onMouseDown => Element.mouseDownEvent.forTarget(this);
 
+  /// Stream of `mouseenter` events handled by this [Document].
   @DomName('Document.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseEnter => Element.mouseEnterEvent.forTarget(this);
 
+  /// Stream of `mouseleave` events handled by this [Document].
   @DomName('Document.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseLeave => Element.mouseLeaveEvent.forTarget(this);
 
+  /// Stream of `mousemove` events handled by this [Document].
   @DomName('Document.onmousemove')
   @DocsEditable()
   Stream<MouseEvent> get onMouseMove => Element.mouseMoveEvent.forTarget(this);
 
+  /// Stream of `mouseout` events handled by this [Document].
   @DomName('Document.onmouseout')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOut => Element.mouseOutEvent.forTarget(this);
 
+  /// Stream of `mouseover` events handled by this [Document].
   @DomName('Document.onmouseover')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOver => Element.mouseOverEvent.forTarget(this);
 
+  /// Stream of `mouseup` events handled by this [Document].
   @DomName('Document.onmouseup')
   @DocsEditable()
   Stream<MouseEvent> get onMouseUp => Element.mouseUpEvent.forTarget(this);
 
+  /// Stream of `mousewheel` events handled by this [Document].
   @DomName('Document.onmousewheel')
   @DocsEditable()
   Stream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent.forTarget(this);
 
+  /// Stream of `paste` events handled by this [Document].
   @DomName('Document.onpaste')
   @DocsEditable()
   Stream<Event> get onPaste => Element.pasteEvent.forTarget(this);
 
+  /// Stream of `readystatechange` events handled by this [Document].
   @DomName('Document.onreadystatechange')
   @DocsEditable()
   Stream<Event> get onReadyStateChange => readyStateChangeEvent.forTarget(this);
 
+  /// Stream of `reset` events handled by this [Document].
   @DomName('Document.onreset')
   @DocsEditable()
   Stream<Event> get onReset => Element.resetEvent.forTarget(this);
 
+  /// Stream of `scroll` events handled by this [Document].
   @DomName('Document.onscroll')
   @DocsEditable()
   Stream<Event> get onScroll => Element.scrollEvent.forTarget(this);
 
+  /// Stream of `search` events handled by this [Document].
   @DomName('Document.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   Stream<Event> get onSearch => Element.searchEvent.forTarget(this);
 
+  /// Stream of `securitypolicyviolation` events handled by this [Document].
   @DomName('Document.onsecuritypolicyviolation')
   @DocsEditable()
   // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#widl-Document-onsecuritypolicyviolation
   @Experimental()
   Stream<SecurityPolicyViolationEvent> get onSecurityPolicyViolation => securityPolicyViolationEvent.forTarget(this);
 
+  /// Stream of `select` events handled by this [Document].
   @DomName('Document.onselect')
   @DocsEditable()
   Stream<Event> get onSelect => Element.selectEvent.forTarget(this);
 
+  /// Stream of `selectionchange` events handled by this [Document].
   @DomName('Document.onselectionchange')
   @DocsEditable()
   Stream<Event> get onSelectionChange => selectionChangeEvent.forTarget(this);
 
+  /// Stream of `selectstart` events handled by this [Document].
   @DomName('Document.onselectstart')
   @DocsEditable()
   Stream<Event> get onSelectStart => Element.selectStartEvent.forTarget(this);
 
+  /// Stream of `submit` events handled by this [Document].
   @DomName('Document.onsubmit')
   @DocsEditable()
   Stream<Event> get onSubmit => Element.submitEvent.forTarget(this);
 
+  /// Stream of `touchcancel` events handled by this [Document].
   @DomName('Document.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchCancel => Element.touchCancelEvent.forTarget(this);
 
+  /// Stream of `touchend` events handled by this [Document].
   @DomName('Document.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchEnd => Element.touchEndEvent.forTarget(this);
 
+  /// Stream of `touchmove` events handled by this [Document].
   @DomName('Document.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchMove => Element.touchMoveEvent.forTarget(this);
 
+  /// Stream of `touchstart` events handled by this [Document].
   @DomName('Document.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchStart => Element.touchStartEvent.forTarget(this);
 
+  /// Stream of `fullscreenchange` events handled by this [Document].
   @DomName('Document.onwebkitfullscreenchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
   Stream<Event> get onFullscreenChange => Element.fullscreenChangeEvent.forTarget(this);
 
+  /// Stream of `fullscreenerror` events handled by this [Document].
   @DomName('Document.onwebkitfullscreenerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
   Stream<Event> get onFullscreenError => Element.fullscreenErrorEvent.forTarget(this);
 
+  /// Stream of `pointerlockchange` events handled by this [Document].
   @DomName('Document.onwebkitpointerlockchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-onpointerlockchange
   @Experimental()
   Stream<Event> get onPointerLockChange => pointerLockChangeEvent.forTarget(this);
 
+  /// Stream of `pointerlockerror` events handled by this [Document].
   @DomName('Document.onwebkitpointerlockerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-onpointerlockerror
@@ -8531,213 +8786,355 @@
   @Experimental()
   CssRect get marginEdge;
 
+  /// Stream of `abort` events handled by this [Element].
   @DomName('Element.onabort')
   @DocsEditable()
   ElementStream<Event> get onAbort;
 
+  /// Stream of `beforecopy` events handled by this [Element].
   @DomName('Element.onbeforecopy')
   @DocsEditable()
   ElementStream<Event> get onBeforeCopy;
 
+  /// Stream of `beforecut` events handled by this [Element].
   @DomName('Element.onbeforecut')
   @DocsEditable()
   ElementStream<Event> get onBeforeCut;
 
+  /// Stream of `beforepaste` events handled by this [Element].
   @DomName('Element.onbeforepaste')
   @DocsEditable()
   ElementStream<Event> get onBeforePaste;
 
+  /// Stream of `blur` events handled by this [Element].
   @DomName('Element.onblur')
   @DocsEditable()
   ElementStream<Event> get onBlur;
 
+  /// Stream of `change` events handled by this [Element].
   @DomName('Element.onchange')
   @DocsEditable()
   ElementStream<Event> get onChange;
 
+  /// Stream of `click` events handled by this [Element].
   @DomName('Element.onclick')
   @DocsEditable()
   ElementStream<MouseEvent> get onClick;
 
+  /// Stream of `contextmenu` events handled by this [Element].
   @DomName('Element.oncontextmenu')
   @DocsEditable()
   ElementStream<MouseEvent> get onContextMenu;
 
+  /// Stream of `copy` events handled by this [Element].
   @DomName('Element.oncopy')
   @DocsEditable()
   ElementStream<Event> get onCopy;
 
+  /// Stream of `cut` events handled by this [Element].
   @DomName('Element.oncut')
   @DocsEditable()
   ElementStream<Event> get onCut;
 
+  /// Stream of `doubleclick` events handled by this [Element].
   @DomName('Element.ondblclick')
   @DocsEditable()
   ElementStream<Event> get onDoubleClick;
 
+  /**
+   * A stream of `drag` events fired when this element currently being dragged.
+   *
+   * A `drag` event is added to this stream as soon as the drag begins.
+   * A `drag` event is also added to this stream at intervals while the drag
+   * operation is still ongoing.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrag')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrag;
 
+  /**
+   * A stream of `dragend` events fired when this element completes a drag
+   * operation.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragend')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnd;
 
+  /**
+   * A stream of `dragenter` events fired when a dragged object is first dragged
+   * over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragenter')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnter;
 
+  /**
+   * A stream of `dragleave` events fired when an object being dragged over this
+   * element leaves this element's target area.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragleave')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragLeave;
 
+  /**
+   * A stream of `dragover` events fired when a dragged object is currently
+   * being dragged over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragover')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragOver;
 
+  /**
+   * A stream of `dragstart` events fired when this element starts being
+   * dragged.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragstart')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragStart;
 
+  /**
+   * A stream of `drop` events fired when a dragged object is dropped on this
+   * element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrop')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrop;
 
+  /// Stream of `error` events handled by this [Element].
   @DomName('Element.onerror')
   @DocsEditable()
   ElementStream<Event> get onError;
 
+  /// Stream of `focus` events handled by this [Element].
   @DomName('Element.onfocus')
   @DocsEditable()
   ElementStream<Event> get onFocus;
 
+  /// Stream of `input` events handled by this [Element].
   @DomName('Element.oninput')
   @DocsEditable()
   ElementStream<Event> get onInput;
 
+  /// Stream of `invalid` events handled by this [Element].
   @DomName('Element.oninvalid')
   @DocsEditable()
   ElementStream<Event> get onInvalid;
 
+  /// Stream of `keydown` events handled by this [Element].
   @DomName('Element.onkeydown')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyDown;
 
+  /// Stream of `keypress` events handled by this [Element].
   @DomName('Element.onkeypress')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyPress;
 
+  /// Stream of `keyup` events handled by this [Element].
   @DomName('Element.onkeyup')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyUp;
 
+  /// Stream of `load` events handled by this [Element].
   @DomName('Element.onload')
   @DocsEditable()
   ElementStream<Event> get onLoad;
 
+  /// Stream of `mousedown` events handled by this [Element].
   @DomName('Element.onmousedown')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseDown;
 
+  /// Stream of `mouseenter` events handled by this [Element].
   @DomName('Element.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseEnter;
 
+  /// Stream of `mouseleave` events handled by this [Element].
   @DomName('Element.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseLeave;
 
+  /// Stream of `mousemove` events handled by this [Element].
   @DomName('Element.onmousemove')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseMove;
 
+  /// Stream of `mouseout` events handled by this [Element].
   @DomName('Element.onmouseout')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOut;
 
+  /// Stream of `mouseover` events handled by this [Element].
   @DomName('Element.onmouseover')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOver;
 
+  /// Stream of `mouseup` events handled by this [Element].
   @DomName('Element.onmouseup')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseUp;
 
+  /// Stream of `mousewheel` events handled by this [Element].
   @DomName('Element.onmousewheel')
   @DocsEditable()
   // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
   @Experimental() // non-standard
   ElementStream<WheelEvent> get onMouseWheel;
 
+  /// Stream of `paste` events handled by this [Element].
   @DomName('Element.onpaste')
   @DocsEditable()
   ElementStream<Event> get onPaste;
 
+  /// Stream of `reset` events handled by this [Element].
   @DomName('Element.onreset')
   @DocsEditable()
   ElementStream<Event> get onReset;
 
+  /// Stream of `scroll` events handled by this [Element].
   @DomName('Element.onscroll')
   @DocsEditable()
   ElementStream<Event> get onScroll;
 
+  /// Stream of `search` events handled by this [Element].
   @DomName('Element.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   ElementStream<Event> get onSearch;
 
+  /// Stream of `select` events handled by this [Element].
   @DomName('Element.onselect')
   @DocsEditable()
   ElementStream<Event> get onSelect;
 
+  /// Stream of `selectstart` events handled by this [Element].
   @DomName('Element.onselectstart')
   @DocsEditable()
   @Experimental() // nonstandard
   ElementStream<Event> get onSelectStart;
 
+  /// Stream of `submit` events handled by this [Element].
   @DomName('Element.onsubmit')
   @DocsEditable()
   ElementStream<Event> get onSubmit;
 
+  /// Stream of `touchcancel` events handled by this [Element].
   @DomName('Element.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchCancel;
 
+  /// Stream of `touchend` events handled by this [Element].
   @DomName('Element.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnd;
 
+  /// Stream of `touchenter` events handled by this [Element].
   @DomName('Element.ontouchenter')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnter;
 
+  /// Stream of `touchleave` events handled by this [Element].
   @DomName('Element.ontouchleave')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchLeave;
 
+  /// Stream of `touchmove` events handled by this [Element].
   @DomName('Element.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchMove;
 
+  /// Stream of `touchstart` events handled by this [Element].
   @DomName('Element.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchStart;
 
+  /// Stream of `transitionend` events handled by this [Element].
   @DomName('Element.ontransitionend')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -8746,12 +9143,14 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   ElementStream<TransitionEvent> get onTransitionEnd;
 
+  /// Stream of `fullscreenchange` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
   ElementStream<Event> get onFullscreenChange;
 
+  /// Stream of `fullscreenerror` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
@@ -8820,213 +9219,355 @@
   List<Node> get rawList => _nodeList;
 
 
+  /// Stream of `abort` events handled by this [Element].
   @DomName('Element.onabort')
   @DocsEditable()
   ElementStream<Event> get onAbort => Element.abortEvent._forElementList(this);
 
+  /// Stream of `beforecopy` events handled by this [Element].
   @DomName('Element.onbeforecopy')
   @DocsEditable()
   ElementStream<Event> get onBeforeCopy => Element.beforeCopyEvent._forElementList(this);
 
+  /// Stream of `beforecut` events handled by this [Element].
   @DomName('Element.onbeforecut')
   @DocsEditable()
   ElementStream<Event> get onBeforeCut => Element.beforeCutEvent._forElementList(this);
 
+  /// Stream of `beforepaste` events handled by this [Element].
   @DomName('Element.onbeforepaste')
   @DocsEditable()
   ElementStream<Event> get onBeforePaste => Element.beforePasteEvent._forElementList(this);
 
+  /// Stream of `blur` events handled by this [Element].
   @DomName('Element.onblur')
   @DocsEditable()
   ElementStream<Event> get onBlur => Element.blurEvent._forElementList(this);
 
+  /// Stream of `change` events handled by this [Element].
   @DomName('Element.onchange')
   @DocsEditable()
   ElementStream<Event> get onChange => Element.changeEvent._forElementList(this);
 
+  /// Stream of `click` events handled by this [Element].
   @DomName('Element.onclick')
   @DocsEditable()
   ElementStream<MouseEvent> get onClick => Element.clickEvent._forElementList(this);
 
+  /// Stream of `contextmenu` events handled by this [Element].
   @DomName('Element.oncontextmenu')
   @DocsEditable()
   ElementStream<MouseEvent> get onContextMenu => Element.contextMenuEvent._forElementList(this);
 
+  /// Stream of `copy` events handled by this [Element].
   @DomName('Element.oncopy')
   @DocsEditable()
   ElementStream<Event> get onCopy => Element.copyEvent._forElementList(this);
 
+  /// Stream of `cut` events handled by this [Element].
   @DomName('Element.oncut')
   @DocsEditable()
   ElementStream<Event> get onCut => Element.cutEvent._forElementList(this);
 
+  /// Stream of `doubleclick` events handled by this [Element].
   @DomName('Element.ondblclick')
   @DocsEditable()
   ElementStream<Event> get onDoubleClick => Element.doubleClickEvent._forElementList(this);
 
+  /**
+   * A stream of `drag` events fired when this element currently being dragged.
+   *
+   * A `drag` event is added to this stream as soon as the drag begins.
+   * A `drag` event is also added to this stream at intervals while the drag
+   * operation is still ongoing.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrag')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrag => Element.dragEvent._forElementList(this);
 
+  /**
+   * A stream of `dragend` events fired when this element completes a drag
+   * operation.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragend')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnd => Element.dragEndEvent._forElementList(this);
 
+  /**
+   * A stream of `dragenter` events fired when a dragged object is first dragged
+   * over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragenter')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnter => Element.dragEnterEvent._forElementList(this);
 
+  /**
+   * A stream of `dragleave` events fired when an object being dragged over this
+   * element leaves this element's target area.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragleave')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragLeave => Element.dragLeaveEvent._forElementList(this);
 
+  /**
+   * A stream of `dragover` events fired when a dragged object is currently
+   * being dragged over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragover')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragOver => Element.dragOverEvent._forElementList(this);
 
+  /**
+   * A stream of `dragstart` events fired when this element starts being
+   * dragged.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragstart')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragStart => Element.dragStartEvent._forElementList(this);
 
+  /**
+   * A stream of `drop` events fired when a dragged object is dropped on this
+   * element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrop')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrop => Element.dropEvent._forElementList(this);
 
+  /// Stream of `error` events handled by this [Element].
   @DomName('Element.onerror')
   @DocsEditable()
   ElementStream<Event> get onError => Element.errorEvent._forElementList(this);
 
+  /// Stream of `focus` events handled by this [Element].
   @DomName('Element.onfocus')
   @DocsEditable()
   ElementStream<Event> get onFocus => Element.focusEvent._forElementList(this);
 
+  /// Stream of `input` events handled by this [Element].
   @DomName('Element.oninput')
   @DocsEditable()
   ElementStream<Event> get onInput => Element.inputEvent._forElementList(this);
 
+  /// Stream of `invalid` events handled by this [Element].
   @DomName('Element.oninvalid')
   @DocsEditable()
   ElementStream<Event> get onInvalid => Element.invalidEvent._forElementList(this);
 
+  /// Stream of `keydown` events handled by this [Element].
   @DomName('Element.onkeydown')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyDown => Element.keyDownEvent._forElementList(this);
 
+  /// Stream of `keypress` events handled by this [Element].
   @DomName('Element.onkeypress')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyPress => Element.keyPressEvent._forElementList(this);
 
+  /// Stream of `keyup` events handled by this [Element].
   @DomName('Element.onkeyup')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyUp => Element.keyUpEvent._forElementList(this);
 
+  /// Stream of `load` events handled by this [Element].
   @DomName('Element.onload')
   @DocsEditable()
   ElementStream<Event> get onLoad => Element.loadEvent._forElementList(this);
 
+  /// Stream of `mousedown` events handled by this [Element].
   @DomName('Element.onmousedown')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseDown => Element.mouseDownEvent._forElementList(this);
 
+  /// Stream of `mouseenter` events handled by this [Element].
   @DomName('Element.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseEnter => Element.mouseEnterEvent._forElementList(this);
 
+  /// Stream of `mouseleave` events handled by this [Element].
   @DomName('Element.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseLeave => Element.mouseLeaveEvent._forElementList(this);
 
+  /// Stream of `mousemove` events handled by this [Element].
   @DomName('Element.onmousemove')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseMove => Element.mouseMoveEvent._forElementList(this);
 
+  /// Stream of `mouseout` events handled by this [Element].
   @DomName('Element.onmouseout')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOut => Element.mouseOutEvent._forElementList(this);
 
+  /// Stream of `mouseover` events handled by this [Element].
   @DomName('Element.onmouseover')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOver => Element.mouseOverEvent._forElementList(this);
 
+  /// Stream of `mouseup` events handled by this [Element].
   @DomName('Element.onmouseup')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseUp => Element.mouseUpEvent._forElementList(this);
 
+  /// Stream of `mousewheel` events handled by this [Element].
   @DomName('Element.onmousewheel')
   @DocsEditable()
   // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
   @Experimental() // non-standard
   ElementStream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent._forElementList(this);
 
+  /// Stream of `paste` events handled by this [Element].
   @DomName('Element.onpaste')
   @DocsEditable()
   ElementStream<Event> get onPaste => Element.pasteEvent._forElementList(this);
 
+  /// Stream of `reset` events handled by this [Element].
   @DomName('Element.onreset')
   @DocsEditable()
   ElementStream<Event> get onReset => Element.resetEvent._forElementList(this);
 
+  /// Stream of `scroll` events handled by this [Element].
   @DomName('Element.onscroll')
   @DocsEditable()
   ElementStream<Event> get onScroll => Element.scrollEvent._forElementList(this);
 
+  /// Stream of `search` events handled by this [Element].
   @DomName('Element.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   ElementStream<Event> get onSearch => Element.searchEvent._forElementList(this);
 
+  /// Stream of `select` events handled by this [Element].
   @DomName('Element.onselect')
   @DocsEditable()
   ElementStream<Event> get onSelect => Element.selectEvent._forElementList(this);
 
+  /// Stream of `selectstart` events handled by this [Element].
   @DomName('Element.onselectstart')
   @DocsEditable()
   @Experimental() // nonstandard
   ElementStream<Event> get onSelectStart => Element.selectStartEvent._forElementList(this);
 
+  /// Stream of `submit` events handled by this [Element].
   @DomName('Element.onsubmit')
   @DocsEditable()
   ElementStream<Event> get onSubmit => Element.submitEvent._forElementList(this);
 
+  /// Stream of `touchcancel` events handled by this [Element].
   @DomName('Element.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchCancel => Element.touchCancelEvent._forElementList(this);
 
+  /// Stream of `touchend` events handled by this [Element].
   @DomName('Element.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnd => Element.touchEndEvent._forElementList(this);
 
+  /// Stream of `touchenter` events handled by this [Element].
   @DomName('Element.ontouchenter')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnter => Element.touchEnterEvent._forElementList(this);
 
+  /// Stream of `touchleave` events handled by this [Element].
   @DomName('Element.ontouchleave')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchLeave => Element.touchLeaveEvent._forElementList(this);
 
+  /// Stream of `touchmove` events handled by this [Element].
   @DomName('Element.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchMove => Element.touchMoveEvent._forElementList(this);
 
+  /// Stream of `touchstart` events handled by this [Element].
   @DomName('Element.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchStart => Element.touchStartEvent._forElementList(this);
 
+  /// Stream of `transitionend` events handled by this [Element].
   @DomName('Element.ontransitionend')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -9035,12 +9576,14 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   ElementStream<TransitionEvent> get onTransitionEnd => Element.transitionEndEvent._forElementList(this);
 
+  /// Stream of `fullscreenchange` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
   ElementStream<Event> get onFullscreenChange => Element.fullscreenChangeEvent._forElementList(this);
 
+  /// Stream of `fullscreenerror` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
@@ -9517,8 +10060,17 @@
   @DocsEditable()
   String get localName => _localName;
 
+  /**
+   * A URI that identifies the XML namespace of this element.
+   *
+   * `null` if no namespace URI is specified.
+   *
+   * ## Other resources
+   *
+   * * [Node.namespaceURI]
+   * (http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-NodeNSname) from W3C.
+   */
   @DomName('Element.namespaceUri')
-  @DocsEditable()
   String get namespaceUri => _namespaceUri;
 
   String toString() => localName;
@@ -9818,136 +10370,392 @@
   // To suppress missing implicit constructor warnings.
   factory Element._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
 
+  /**
+   * Static factory designed to expose `beforecopy` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.beforecopyEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforeCopyEvent = const EventStreamProvider<Event>('beforecopy');
 
+  /**
+   * Static factory designed to expose `beforecut` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.beforecutEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforeCutEvent = const EventStreamProvider<Event>('beforecut');
 
+  /**
+   * Static factory designed to expose `beforepaste` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.beforepasteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforePasteEvent = const EventStreamProvider<Event>('beforepaste');
 
+  /**
+   * Static factory designed to expose `blur` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.blurEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
 
+  /**
+   * Static factory designed to expose `change` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.changeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
 
+  /**
+   * Static factory designed to expose `click` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.clickEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> clickEvent = const EventStreamProvider<MouseEvent>('click');
 
+  /**
+   * Static factory designed to expose `contextmenu` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.contextmenuEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> contextMenuEvent = const EventStreamProvider<MouseEvent>('contextmenu');
 
+  /**
+   * Static factory designed to expose `copy` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.copyEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> copyEvent = const EventStreamProvider<Event>('copy');
 
+  /**
+   * Static factory designed to expose `cut` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.cutEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> cutEvent = const EventStreamProvider<Event>('cut');
 
+  /**
+   * Static factory designed to expose `doubleclick` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.dblclickEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> doubleClickEvent = const EventStreamProvider<Event>('dblclick');
 
+  /**
+   * A stream of `drag` events fired when an element is currently being dragged.
+   *
+   * A `drag` event is added to this stream as soon as the drag begins.
+   * A `drag` event is also added to this stream at intervals while the drag
+   * operation is still ongoing.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEvent = const EventStreamProvider<MouseEvent>('drag');
 
+  /**
+   * A stream of `dragend` events fired when an element completes a drag
+   * operation.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragendEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEndEvent = const EventStreamProvider<MouseEvent>('dragend');
 
+  /**
+   * A stream of `dragenter` events fired when a dragged object is first dragged
+   * over an element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragenterEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEnterEvent = const EventStreamProvider<MouseEvent>('dragenter');
 
+  /**
+   * A stream of `dragleave` events fired when an object being dragged over an
+   * element leaves the element's target area.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragleaveEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragLeaveEvent = const EventStreamProvider<MouseEvent>('dragleave');
 
+  /**
+   * A stream of `dragover` events fired when a dragged object is currently
+   * being dragged over an element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragoverEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragOverEvent = const EventStreamProvider<MouseEvent>('dragover');
 
+  /**
+   * A stream of `dragstart` events for a dragged element whose drag has begun.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragstartEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragStartEvent = const EventStreamProvider<MouseEvent>('dragstart');
 
+  /**
+   * A stream of `drop` events fired when a dragged object is dropped on an
+   * element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dropEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dropEvent = const EventStreamProvider<MouseEvent>('drop');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `focus` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.focusEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
 
+  /**
+   * Static factory designed to expose `input` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.inputEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> inputEvent = const EventStreamProvider<Event>('input');
 
+  /**
+   * Static factory designed to expose `invalid` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.invalidEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> invalidEvent = const EventStreamProvider<Event>('invalid');
 
+  /**
+   * Static factory designed to expose `keydown` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.keydownEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyDownEvent = const EventStreamProvider<KeyboardEvent>('keydown');
 
+  /**
+   * Static factory designed to expose `keypress` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.keypressEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyPressEvent = const EventStreamProvider<KeyboardEvent>('keypress');
 
+  /**
+   * Static factory designed to expose `keyup` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.keyupEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyUpEvent = const EventStreamProvider<KeyboardEvent>('keyup');
 
+  /**
+   * Static factory designed to expose `load` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.loadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
 
+  /**
+   * Static factory designed to expose `mousedown` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mousedownEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseDownEvent = const EventStreamProvider<MouseEvent>('mousedown');
 
+  /**
+   * Static factory designed to expose `mouseenter` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseenterEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseEnterEvent = const EventStreamProvider<MouseEvent>('mouseenter');
 
+  /**
+   * Static factory designed to expose `mouseleave` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseleaveEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseLeaveEvent = const EventStreamProvider<MouseEvent>('mouseleave');
 
+  /**
+   * Static factory designed to expose `mousemove` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mousemoveEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseMoveEvent = const EventStreamProvider<MouseEvent>('mousemove');
 
+  /**
+   * Static factory designed to expose `mouseout` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseoutEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseOutEvent = const EventStreamProvider<MouseEvent>('mouseout');
 
+  /**
+   * Static factory designed to expose `mouseover` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseoverEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseOverEvent = const EventStreamProvider<MouseEvent>('mouseover');
 
+  /**
+   * Static factory designed to expose `mouseup` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseupEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseUpEvent = const EventStreamProvider<MouseEvent>('mouseup');
@@ -9958,67 +10766,145 @@
   @Experimental() // non-standard
   static const EventStreamProvider<WheelEvent> mouseWheelEvent = const EventStreamProvider<WheelEvent>('mousewheel');
 
+  /**
+   * Static factory designed to expose `paste` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.pasteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pasteEvent = const EventStreamProvider<Event>('paste');
 
+  /**
+   * Static factory designed to expose `reset` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.resetEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> resetEvent = const EventStreamProvider<Event>('reset');
 
+  /**
+   * Static factory designed to expose `scroll` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.scrollEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> scrollEvent = const EventStreamProvider<Event>('scroll');
 
+  /**
+   * Static factory designed to expose `search` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.searchEvent')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');
 
+  /**
+   * Static factory designed to expose `select` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.selectEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> selectEvent = const EventStreamProvider<Event>('select');
 
+  /**
+   * Static factory designed to expose `selectstart` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.selectstartEvent')
   @DocsEditable()
   @Experimental() // nonstandard
   static const EventStreamProvider<Event> selectStartEvent = const EventStreamProvider<Event>('selectstart');
 
+  /**
+   * Static factory designed to expose `submit` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.submitEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> submitEvent = const EventStreamProvider<Event>('submit');
 
+  /**
+   * Static factory designed to expose `touchcancel` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchcancelEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchCancelEvent = const EventStreamProvider<TouchEvent>('touchcancel');
 
+  /**
+   * Static factory designed to expose `touchend` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchendEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchEndEvent = const EventStreamProvider<TouchEvent>('touchend');
 
+  /**
+   * Static factory designed to expose `touchenter` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchenterEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchEnterEvent = const EventStreamProvider<TouchEvent>('touchenter');
 
+  /**
+   * Static factory designed to expose `touchleave` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchleaveEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchLeaveEvent = const EventStreamProvider<TouchEvent>('touchleave');
 
+  /**
+   * Static factory designed to expose `touchmove` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchmoveEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchMoveEvent = const EventStreamProvider<TouchEvent>('touchmove');
 
+  /**
+   * Static factory designed to expose `touchstart` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchstartEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
@@ -10029,6 +10915,12 @@
   @DocsEditable()
   static const EventStreamProvider<TransitionEvent> transitionEndEvent = const EventStreamProvider<TransitionEvent>('transitionend');
 
+  /**
+   * Static factory designed to expose `fullscreenchange` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.webkitfullscreenchangeEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -10037,6 +10929,12 @@
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   static const EventStreamProvider<Event> fullscreenChangeEvent = const EventStreamProvider<Event>('webkitfullscreenchange');
 
+  /**
+   * Static factory designed to expose `fullscreenerror` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.webkitfullscreenerrorEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -10147,11 +11045,37 @@
   @DocsEditable()
   int get offsetWidth native "Element_offsetWidth_Getter";
 
+  /**
+   * The name of this element's custom pseudo-element.
+   *
+   * This value must begin with an x and a hyphen, `x-`, to be considered valid.
+   *
+   * ## Other resources
+   *
+   * * [Using custom pseudo elements]
+   * (http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom-201/#toc-custom-pseduo)
+   * from HTML5Rocks.
+   * * [Custom pseudo-elements]
+   * (http://www.w3.org/TR/shadow-dom/#custom-pseudo-elements) from W3C.
+   */
   @DomName('Element.pseudo')
   @DocsEditable()
   @Experimental() // untriaged
   String get pseudo native "Element_pseudo_Getter";
 
+  /**
+   * The name of this element's custom pseudo-element.
+   *
+   * This value must begin with an x and a hyphen, `x-`, to be considered valid.
+   *
+   * ## Other resources
+   *
+   * * [Using custom pseudo elements]
+   * (http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom-201/#toc-custom-pseduo)
+   * from HTML5Rocks.
+   * * [Custom pseudo-elements]
+   * (http://www.w3.org/TR/shadow-dom/#custom-pseudo-elements) from W3C.
+   */
   @DomName('Element.pseudo')
   @DocsEditable()
   @Experimental() // untriaged
@@ -10195,6 +11119,22 @@
   @DocsEditable()
   String get tagName native "Element_tagName_Getter";
 
+  /**
+   * The current state of this region.
+   *
+   * If `"empty"`, then there is no content in this region.
+   * If `"fit"`, then content fits into this region, and more content can be
+   * added. If `"overset"`, then there is more content than can be fit into this
+   * region.
+   *
+   * ## Other resources
+   *
+   * * [CSS regions and exclusions tutorial]
+   * (http://www.html5rocks.com/en/tutorials/regions/adobe/) from HTML5Rocks.
+   * * [Regions](http://html.adobe.com/webplatform/layout/regions/) from Adobe.
+   * * [CSS regions specification]
+   * (http://www.w3.org/TR/css3-regions/) from W3C.
+   */
   @DomName('Element.webkitRegionOverset')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -10228,10 +11168,33 @@
   @Experimental() // untriaged
   String getAttributeNS(String namespaceURI, String localName) native "Element_getAttributeNS_Callback";
 
+  /**
+   * The smallest bounding rectangle that encompasses this element's padding,
+   * scrollbar, and border.
+   *
+   * ## Other resources
+   *
+   * * [Element.getBoundingClientRect]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect)
+   * from MDN.
+   * * [The getBoundingClientRect() method]
+   * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods) from W3C.
+   */
   @DomName('Element.getBoundingClientRect')
   @DocsEditable()
   Rectangle getBoundingClientRect() native "Element_getBoundingClientRect_Callback";
 
+  /**
+   * A list of bounding rectangles for each box associated with this element.
+   *
+   * ## Other resources
+   *
+   * * [Element.getClientRects]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Element.getClientRects)
+   * from MDN.
+   * * [The getClientRects() method]
+   * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods) from W3C.
+   */
   @DomName('Element.getClientRects')
   @DocsEditable()
   List<Rectangle> getClientRects() native "Element_getClientRects_Callback";
@@ -10390,213 +11353,355 @@
   @DocsEditable()
   Element get _lastElementChild native "Element_lastElementChild_Getter";
 
+  /// Stream of `abort` events handled by this [Element].
   @DomName('Element.onabort')
   @DocsEditable()
   ElementStream<Event> get onAbort => abortEvent.forElement(this);
 
+  /// Stream of `beforecopy` events handled by this [Element].
   @DomName('Element.onbeforecopy')
   @DocsEditable()
   ElementStream<Event> get onBeforeCopy => beforeCopyEvent.forElement(this);
 
+  /// Stream of `beforecut` events handled by this [Element].
   @DomName('Element.onbeforecut')
   @DocsEditable()
   ElementStream<Event> get onBeforeCut => beforeCutEvent.forElement(this);
 
+  /// Stream of `beforepaste` events handled by this [Element].
   @DomName('Element.onbeforepaste')
   @DocsEditable()
   ElementStream<Event> get onBeforePaste => beforePasteEvent.forElement(this);
 
+  /// Stream of `blur` events handled by this [Element].
   @DomName('Element.onblur')
   @DocsEditable()
   ElementStream<Event> get onBlur => blurEvent.forElement(this);
 
+  /// Stream of `change` events handled by this [Element].
   @DomName('Element.onchange')
   @DocsEditable()
   ElementStream<Event> get onChange => changeEvent.forElement(this);
 
+  /// Stream of `click` events handled by this [Element].
   @DomName('Element.onclick')
   @DocsEditable()
   ElementStream<MouseEvent> get onClick => clickEvent.forElement(this);
 
+  /// Stream of `contextmenu` events handled by this [Element].
   @DomName('Element.oncontextmenu')
   @DocsEditable()
   ElementStream<MouseEvent> get onContextMenu => contextMenuEvent.forElement(this);
 
+  /// Stream of `copy` events handled by this [Element].
   @DomName('Element.oncopy')
   @DocsEditable()
   ElementStream<Event> get onCopy => copyEvent.forElement(this);
 
+  /// Stream of `cut` events handled by this [Element].
   @DomName('Element.oncut')
   @DocsEditable()
   ElementStream<Event> get onCut => cutEvent.forElement(this);
 
+  /// Stream of `doubleclick` events handled by this [Element].
   @DomName('Element.ondblclick')
   @DocsEditable()
   ElementStream<Event> get onDoubleClick => doubleClickEvent.forElement(this);
 
+  /**
+   * A stream of `drag` events fired when this element currently being dragged.
+   *
+   * A `drag` event is added to this stream as soon as the drag begins.
+   * A `drag` event is also added to this stream at intervals while the drag
+   * operation is still ongoing.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrag')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrag => dragEvent.forElement(this);
 
+  /**
+   * A stream of `dragend` events fired when this element completes a drag
+   * operation.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragend')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnd => dragEndEvent.forElement(this);
 
+  /**
+   * A stream of `dragenter` events fired when a dragged object is first dragged
+   * over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragenter')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnter => dragEnterEvent.forElement(this);
 
+  /**
+   * A stream of `dragleave` events fired when an object being dragged over this
+   * element leaves this element's target area.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragleave')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragLeave => dragLeaveEvent.forElement(this);
 
+  /**
+   * A stream of `dragover` events fired when a dragged object is currently
+   * being dragged over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragover')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragOver => dragOverEvent.forElement(this);
 
+  /**
+   * A stream of `dragstart` events fired when this element starts being
+   * dragged.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragstart')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragStart => dragStartEvent.forElement(this);
 
+  /**
+   * A stream of `drop` events fired when a dragged object is dropped on this
+   * element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrop')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrop => dropEvent.forElement(this);
 
+  /// Stream of `error` events handled by this [Element].
   @DomName('Element.onerror')
   @DocsEditable()
   ElementStream<Event> get onError => errorEvent.forElement(this);
 
+  /// Stream of `focus` events handled by this [Element].
   @DomName('Element.onfocus')
   @DocsEditable()
   ElementStream<Event> get onFocus => focusEvent.forElement(this);
 
+  /// Stream of `input` events handled by this [Element].
   @DomName('Element.oninput')
   @DocsEditable()
   ElementStream<Event> get onInput => inputEvent.forElement(this);
 
+  /// Stream of `invalid` events handled by this [Element].
   @DomName('Element.oninvalid')
   @DocsEditable()
   ElementStream<Event> get onInvalid => invalidEvent.forElement(this);
 
+  /// Stream of `keydown` events handled by this [Element].
   @DomName('Element.onkeydown')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyDown => keyDownEvent.forElement(this);
 
+  /// Stream of `keypress` events handled by this [Element].
   @DomName('Element.onkeypress')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyPress => keyPressEvent.forElement(this);
 
+  /// Stream of `keyup` events handled by this [Element].
   @DomName('Element.onkeyup')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyUp => keyUpEvent.forElement(this);
 
+  /// Stream of `load` events handled by this [Element].
   @DomName('Element.onload')
   @DocsEditable()
   ElementStream<Event> get onLoad => loadEvent.forElement(this);
 
+  /// Stream of `mousedown` events handled by this [Element].
   @DomName('Element.onmousedown')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseDown => mouseDownEvent.forElement(this);
 
+  /// Stream of `mouseenter` events handled by this [Element].
   @DomName('Element.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseEnter => mouseEnterEvent.forElement(this);
 
+  /// Stream of `mouseleave` events handled by this [Element].
   @DomName('Element.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseLeave => mouseLeaveEvent.forElement(this);
 
+  /// Stream of `mousemove` events handled by this [Element].
   @DomName('Element.onmousemove')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseMove => mouseMoveEvent.forElement(this);
 
+  /// Stream of `mouseout` events handled by this [Element].
   @DomName('Element.onmouseout')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOut => mouseOutEvent.forElement(this);
 
+  /// Stream of `mouseover` events handled by this [Element].
   @DomName('Element.onmouseover')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOver => mouseOverEvent.forElement(this);
 
+  /// Stream of `mouseup` events handled by this [Element].
   @DomName('Element.onmouseup')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseUp => mouseUpEvent.forElement(this);
 
+  /// Stream of `mousewheel` events handled by this [Element].
   @DomName('Element.onmousewheel')
   @DocsEditable()
   // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
   @Experimental() // non-standard
   ElementStream<WheelEvent> get onMouseWheel => mouseWheelEvent.forElement(this);
 
+  /// Stream of `paste` events handled by this [Element].
   @DomName('Element.onpaste')
   @DocsEditable()
   ElementStream<Event> get onPaste => pasteEvent.forElement(this);
 
+  /// Stream of `reset` events handled by this [Element].
   @DomName('Element.onreset')
   @DocsEditable()
   ElementStream<Event> get onReset => resetEvent.forElement(this);
 
+  /// Stream of `scroll` events handled by this [Element].
   @DomName('Element.onscroll')
   @DocsEditable()
   ElementStream<Event> get onScroll => scrollEvent.forElement(this);
 
+  /// Stream of `search` events handled by this [Element].
   @DomName('Element.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   ElementStream<Event> get onSearch => searchEvent.forElement(this);
 
+  /// Stream of `select` events handled by this [Element].
   @DomName('Element.onselect')
   @DocsEditable()
   ElementStream<Event> get onSelect => selectEvent.forElement(this);
 
+  /// Stream of `selectstart` events handled by this [Element].
   @DomName('Element.onselectstart')
   @DocsEditable()
   @Experimental() // nonstandard
   ElementStream<Event> get onSelectStart => selectStartEvent.forElement(this);
 
+  /// Stream of `submit` events handled by this [Element].
   @DomName('Element.onsubmit')
   @DocsEditable()
   ElementStream<Event> get onSubmit => submitEvent.forElement(this);
 
+  /// Stream of `touchcancel` events handled by this [Element].
   @DomName('Element.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchCancel => touchCancelEvent.forElement(this);
 
+  /// Stream of `touchend` events handled by this [Element].
   @DomName('Element.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnd => touchEndEvent.forElement(this);
 
+  /// Stream of `touchenter` events handled by this [Element].
   @DomName('Element.ontouchenter')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnter => touchEnterEvent.forElement(this);
 
+  /// Stream of `touchleave` events handled by this [Element].
   @DomName('Element.ontouchleave')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchLeave => touchLeaveEvent.forElement(this);
 
+  /// Stream of `touchmove` events handled by this [Element].
   @DomName('Element.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchMove => touchMoveEvent.forElement(this);
 
+  /// Stream of `touchstart` events handled by this [Element].
   @DomName('Element.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchStart => touchStartEvent.forElement(this);
 
+  /// Stream of `transitionend` events handled by this [Element].
   @DomName('Element.ontransitionend')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -10605,12 +11710,14 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   ElementStream<TransitionEvent> get onTransitionEnd => transitionEndEvent.forElement(this);
 
+  /// Stream of `fullscreenchange` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
   ElementStream<Event> get onFullscreenChange => fullscreenChangeEvent.forElement(this);
 
+  /// Stream of `fullscreenerror` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
@@ -11065,14 +12172,32 @@
   // To suppress missing implicit constructor warnings.
   factory EventSource._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [EventSource].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('EventSource.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [EventSource].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('EventSource.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+  /**
+   * Static factory designed to expose `open` events to event
+   * handlers that are not necessarily instances of [EventSource].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('EventSource.openEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
@@ -11126,14 +12251,17 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "EventSource_removeEventListener_Callback";
 
+  /// Stream of `error` events handled by this [EventSource].
   @DomName('EventSource.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `message` events handled by this [EventSource].
   @DomName('EventSource.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
+  /// Stream of `open` events handled by this [EventSource].
   @DomName('EventSource.onopen')
   @DocsEditable()
   Stream<Event> get onOpen => openEvent.forTarget(this);
@@ -11559,26 +12687,62 @@
   // To suppress missing implicit constructor warnings.
   factory FileReader._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `load` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.loadEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> loadEvent = const EventStreamProvider<ProgressEvent>('load');
 
+  /**
+   * Static factory designed to expose `loadend` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.loadendEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> loadEndEvent = const EventStreamProvider<ProgressEvent>('loadend');
 
+  /**
+   * Static factory designed to expose `loadstart` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.loadstartEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> loadStartEvent = const EventStreamProvider<ProgressEvent>('loadstart');
 
+  /**
+   * Static factory designed to expose `progress` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.progressEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
@@ -11653,26 +12817,32 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "FileReader_removeEventListener_Callback";
 
+  /// Stream of `abort` events handled by this [FileReader].
   @DomName('FileReader.onabort')
   @DocsEditable()
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [FileReader].
   @DomName('FileReader.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `load` events handled by this [FileReader].
   @DomName('FileReader.onload')
   @DocsEditable()
   Stream<ProgressEvent> get onLoad => loadEvent.forTarget(this);
 
+  /// Stream of `loadend` events handled by this [FileReader].
   @DomName('FileReader.onloadend')
   @DocsEditable()
   Stream<ProgressEvent> get onLoadEnd => loadEndEvent.forTarget(this);
 
+  /// Stream of `loadstart` events handled by this [FileReader].
   @DomName('FileReader.onloadstart')
   @DocsEditable()
   Stream<ProgressEvent> get onLoadStart => loadStartEvent.forTarget(this);
 
+  /// Stream of `progress` events handled by this [FileReader].
   @DomName('FileReader.onprogress')
   @DocsEditable()
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
@@ -11752,26 +12922,62 @@
   // To suppress missing implicit constructor warnings.
   factory FileWriter._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `progress` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.progressEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
 
+  /**
+   * Static factory designed to expose `write` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.writeEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> writeEvent = const EventStreamProvider<ProgressEvent>('write');
 
+  /**
+   * Static factory designed to expose `writeend` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.writeendEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> writeEndEvent = const EventStreamProvider<ProgressEvent>('writeend');
 
+  /**
+   * Static factory designed to expose `writestart` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.writestartEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> writeStartEvent = const EventStreamProvider<ProgressEvent>('writestart');
@@ -11832,26 +13038,32 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "FileWriter_removeEventListener_Callback";
 
+  /// Stream of `abort` events handled by this [FileWriter].
   @DomName('FileWriter.onabort')
   @DocsEditable()
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [FileWriter].
   @DomName('FileWriter.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `progress` events handled by this [FileWriter].
   @DomName('FileWriter.onprogress')
   @DocsEditable()
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
 
+  /// Stream of `write` events handled by this [FileWriter].
   @DomName('FileWriter.onwrite')
   @DocsEditable()
   Stream<ProgressEvent> get onWrite => writeEvent.forTarget(this);
 
+  /// Stream of `writeend` events handled by this [FileWriter].
   @DomName('FileWriter.onwriteend')
   @DocsEditable()
   Stream<ProgressEvent> get onWriteEnd => writeEndEvent.forTarget(this);
 
+  /// Stream of `writestart` events handled by this [FileWriter].
   @DomName('FileWriter.onwritestart')
   @DocsEditable()
   Stream<ProgressEvent> get onWriteStart => writeStartEvent.forTarget(this);
@@ -12079,12 +13291,24 @@
   // To suppress missing implicit constructor warnings.
   factory FormElement._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `autocomplete` events to event
+   * handlers that are not necessarily instances of [FormElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLFormElement.autocompleteEvent')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
   @Experimental()
   static const EventStreamProvider<Event> autocompleteEvent = const EventStreamProvider<Event>('autocomplete');
 
+  /**
+   * Static factory designed to expose `autocompleteerror` events to event
+   * handlers that are not necessarily instances of [FormElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLFormElement.autocompleteerrorEvent')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
@@ -12203,12 +13427,14 @@
   @DocsEditable()
   void submit() native "HTMLFormElement_submit_Callback";
 
+  /// Stream of `autocomplete` events handled by this [FormElement].
   @DomName('HTMLFormElement.onautocomplete')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
   @Experimental()
   ElementStream<Event> get onAutocomplete => autocompleteEvent.forElement(this);
 
+  /// Stream of `autocompleteerror` events handled by this [FormElement].
   @DomName('HTMLFormElement.onautocompleteerror')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
@@ -12906,6 +14132,12 @@
     _Utils.register(this, tag, customElementClass, extendsTag);
   }
 
+  /**
+   * Static factory designed to expose `visibilitychange` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.visibilityChange')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
@@ -13419,6 +14651,12 @@
   // To suppress missing implicit constructor warnings.
   factory HttpRequest._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `readystatechange` events to event
+   * handlers that are not necessarily instances of [HttpRequest].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequest.readystatechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> readyStateChangeEvent = const EventStreamProvider<ProgressEvent>('readystatechange');
@@ -13709,7 +14947,8 @@
   @DocsEditable()
   void setRequestHeader(String header, String value) native "XMLHttpRequest_setRequestHeader_Callback";
 
-  /**
+  /// Stream of `readystatechange` events handled by this [HttpRequest].
+/**
    * Event listeners to be notified every time the [HttpRequest]
    * object's `readyState` changes values.
    */
@@ -13732,36 +14971,78 @@
   // To suppress missing implicit constructor warnings.
   factory HttpRequestEventTarget._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.abortEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.errorEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> errorEvent = const EventStreamProvider<ProgressEvent>('error');
 
+  /**
+   * Static factory designed to expose `load` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.loadEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> loadEvent = const EventStreamProvider<ProgressEvent>('load');
 
+  /**
+   * Static factory designed to expose `loadend` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.loadendEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> loadEndEvent = const EventStreamProvider<ProgressEvent>('loadend');
 
+  /**
+   * Static factory designed to expose `loadstart` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.loadstartEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> loadStartEvent = const EventStreamProvider<ProgressEvent>('loadstart');
 
+  /**
+   * Static factory designed to expose `progress` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.progressEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
 
+  /**
+   * Static factory designed to expose `timeout` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.timeoutEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -13782,21 +15063,25 @@
   @Experimental() // untriaged
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequestEventTarget_removeEventListener_Callback";
 
+  /// Stream of `abort` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onabort')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onerror')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<ProgressEvent> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `load` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onload')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<ProgressEvent> get onLoad => loadEvent.forTarget(this);
 
+  /// Stream of `loadend` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onloadend')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -13806,11 +15091,13 @@
   @Experimental() // untriaged
   Stream<ProgressEvent> get onLoadEnd => loadEndEvent.forTarget(this);
 
+  /// Stream of `loadstart` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onloadstart')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<ProgressEvent> get onLoadStart => loadStartEvent.forTarget(this);
 
+  /// Stream of `progress` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onprogress')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -13820,6 +15107,7 @@
   @Experimental() // untriaged
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
 
+  /// Stream of `timeout` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.ontimeout')
   @DocsEditable()
   @Experimental() // untriaged
@@ -14131,6 +15419,12 @@
   // To suppress missing implicit constructor warnings.
   factory InputElement._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `speechchange` events to event
+   * handlers that are not necessarily instances of [InputElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLInputElement.webkitSpeechChangeEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -14610,6 +15904,7 @@
 
   void _stepUp_2() native "HTMLInputElement__stepUp_2_Callback";
 
+  /// Stream of `speechchange` events handled by this [InputElement].
   @DomName('HTMLInputElement.onwebkitSpeechChange')
   @DocsEditable()
   // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#extending_html_elements
@@ -15917,92 +17212,224 @@
   // To suppress missing implicit constructor warnings.
   factory MediaElement._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `canplay` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.canplayEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> canPlayEvent = const EventStreamProvider<Event>('canplay');
 
+  /**
+   * Static factory designed to expose `canplaythrough` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.canplaythroughEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> canPlayThroughEvent = const EventStreamProvider<Event>('canplaythrough');
 
+  /**
+   * Static factory designed to expose `durationchange` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.durationchangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> durationChangeEvent = const EventStreamProvider<Event>('durationchange');
 
+  /**
+   * Static factory designed to expose `emptied` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.emptiedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> emptiedEvent = const EventStreamProvider<Event>('emptied');
 
+  /**
+   * Static factory designed to expose `ended` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.endedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
 
+  /**
+   * Static factory designed to expose `loadeddata` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.loadeddataEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadedDataEvent = const EventStreamProvider<Event>('loadeddata');
 
+  /**
+   * Static factory designed to expose `loadedmetadata` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.loadedmetadataEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadedMetadataEvent = const EventStreamProvider<Event>('loadedmetadata');
 
+  /**
+   * Static factory designed to expose `loadstart` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.loadstartEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadStartEvent = const EventStreamProvider<Event>('loadstart');
 
+  /**
+   * Static factory designed to expose `pause` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.pauseEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
 
+  /**
+   * Static factory designed to expose `play` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.playEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> playEvent = const EventStreamProvider<Event>('play');
 
+  /**
+   * Static factory designed to expose `playing` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.playingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> playingEvent = const EventStreamProvider<Event>('playing');
 
+  /**
+   * Static factory designed to expose `progress` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.progressEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> progressEvent = const EventStreamProvider<Event>('progress');
 
+  /**
+   * Static factory designed to expose `ratechange` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.ratechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> rateChangeEvent = const EventStreamProvider<Event>('ratechange');
 
+  /**
+   * Static factory designed to expose `seeked` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.seekedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> seekedEvent = const EventStreamProvider<Event>('seeked');
 
+  /**
+   * Static factory designed to expose `seeking` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.seekingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> seekingEvent = const EventStreamProvider<Event>('seeking');
 
+  /**
+   * Static factory designed to expose `show` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.showEvent')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#event-media-loadstart
   @Experimental()
   static const EventStreamProvider<Event> showEvent = const EventStreamProvider<Event>('show');
 
+  /**
+   * Static factory designed to expose `stalled` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.stalledEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> stalledEvent = const EventStreamProvider<Event>('stalled');
 
+  /**
+   * Static factory designed to expose `suspend` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.suspendEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> suspendEvent = const EventStreamProvider<Event>('suspend');
 
+  /**
+   * Static factory designed to expose `timeupdate` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.timeupdateEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> timeUpdateEvent = const EventStreamProvider<Event>('timeupdate');
 
+  /**
+   * Static factory designed to expose `volumechange` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.volumechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> volumeChangeEvent = const EventStreamProvider<Event>('volumechange');
 
+  /**
+   * Static factory designed to expose `waiting` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.waitingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> waitingEvent = const EventStreamProvider<Event>('waiting');
 
+  /**
+   * Static factory designed to expose `keyadded` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.webkitkeyaddedEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -16011,6 +17438,12 @@
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   static const EventStreamProvider<MediaKeyEvent> keyAddedEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyadded');
 
+  /**
+   * Static factory designed to expose `keyerror` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.webkitkeyerrorEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -16019,6 +17452,12 @@
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   static const EventStreamProvider<MediaKeyEvent> keyErrorEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyerror');
 
+  /**
+   * Static factory designed to expose `keymessage` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.webkitkeymessageEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -16027,6 +17466,12 @@
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   static const EventStreamProvider<MediaKeyEvent> keyMessageEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeymessage');
 
+  /**
+   * Static factory designed to expose `needkey` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.webkitneedkeyEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -16377,110 +17822,135 @@
 
   void _webkitGenerateKeyRequest_2(keySystem) native "HTMLMediaElement__webkitGenerateKeyRequest_2_Callback";
 
+  /// Stream of `canplay` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.oncanplay')
   @DocsEditable()
   ElementStream<Event> get onCanPlay => canPlayEvent.forElement(this);
 
+  /// Stream of `canplaythrough` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.oncanplaythrough')
   @DocsEditable()
   ElementStream<Event> get onCanPlayThrough => canPlayThroughEvent.forElement(this);
 
+  /// Stream of `durationchange` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.ondurationchange')
   @DocsEditable()
   ElementStream<Event> get onDurationChange => durationChangeEvent.forElement(this);
 
+  /// Stream of `emptied` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onemptied')
   @DocsEditable()
   ElementStream<Event> get onEmptied => emptiedEvent.forElement(this);
 
+  /// Stream of `ended` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onended')
   @DocsEditable()
   ElementStream<Event> get onEnded => endedEvent.forElement(this);
 
+  /// Stream of `loadeddata` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onloadeddata')
   @DocsEditable()
   ElementStream<Event> get onLoadedData => loadedDataEvent.forElement(this);
 
+  /// Stream of `loadedmetadata` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onloadedmetadata')
   @DocsEditable()
   ElementStream<Event> get onLoadedMetadata => loadedMetadataEvent.forElement(this);
 
+  /// Stream of `loadstart` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onloadstart')
   @DocsEditable()
   ElementStream<Event> get onLoadStart => loadStartEvent.forElement(this);
 
+  /// Stream of `pause` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onpause')
   @DocsEditable()
   ElementStream<Event> get onPause => pauseEvent.forElement(this);
 
+  /// Stream of `play` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onplay')
   @DocsEditable()
   ElementStream<Event> get onPlay => playEvent.forElement(this);
 
+  /// Stream of `playing` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onplaying')
   @DocsEditable()
   ElementStream<Event> get onPlaying => playingEvent.forElement(this);
 
+  /// Stream of `progress` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onprogress')
   @DocsEditable()
   ElementStream<Event> get onProgress => progressEvent.forElement(this);
 
+  /// Stream of `ratechange` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onratechange')
   @DocsEditable()
   ElementStream<Event> get onRateChange => rateChangeEvent.forElement(this);
 
+  /// Stream of `seeked` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onseeked')
   @DocsEditable()
   ElementStream<Event> get onSeeked => seekedEvent.forElement(this);
 
+  /// Stream of `seeking` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onseeking')
   @DocsEditable()
   ElementStream<Event> get onSeeking => seekingEvent.forElement(this);
 
+  /// Stream of `show` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onshow')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#event-media-loadstart
   @Experimental()
   ElementStream<Event> get onShow => showEvent.forElement(this);
 
+  /// Stream of `stalled` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onstalled')
   @DocsEditable()
   ElementStream<Event> get onStalled => stalledEvent.forElement(this);
 
+  /// Stream of `suspend` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onsuspend')
   @DocsEditable()
   ElementStream<Event> get onSuspend => suspendEvent.forElement(this);
 
+  /// Stream of `timeupdate` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.ontimeupdate')
   @DocsEditable()
   ElementStream<Event> get onTimeUpdate => timeUpdateEvent.forElement(this);
 
+  /// Stream of `volumechange` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onvolumechange')
   @DocsEditable()
   ElementStream<Event> get onVolumeChange => volumeChangeEvent.forElement(this);
 
+  /// Stream of `waiting` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwaiting')
   @DocsEditable()
   ElementStream<Event> get onWaiting => waitingEvent.forElement(this);
 
+  /// Stream of `keyadded` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwebkitkeyadded')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   @Experimental()
   ElementStream<MediaKeyEvent> get onKeyAdded => keyAddedEvent.forElement(this);
 
+  /// Stream of `keyerror` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwebkitkeyerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   @Experimental()
   ElementStream<MediaKeyEvent> get onKeyError => keyErrorEvent.forElement(this);
 
+  /// Stream of `keymessage` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwebkitkeymessage')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   @Experimental()
   ElementStream<MediaKeyEvent> get onKeyMessage => keyMessageEvent.forElement(this);
 
+  /// Stream of `needkey` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwebkitneedkey')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
@@ -16681,6 +18151,12 @@
   // To suppress missing implicit constructor warnings.
   factory MediaKeySession._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `keyadded` events to event
+   * handlers that are not necessarily instances of [MediaKeySession].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaKeySession.webkitkeyaddedEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -16688,6 +18164,12 @@
   @Experimental()
   static const EventStreamProvider<MediaKeyEvent> keyAddedEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyadded');
 
+  /**
+   * Static factory designed to expose `keyerror` events to event
+   * handlers that are not necessarily instances of [MediaKeySession].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaKeySession.webkitkeyerrorEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -16695,6 +18177,12 @@
   @Experimental()
   static const EventStreamProvider<MediaKeyEvent> keyErrorEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyerror');
 
+  /**
+   * Static factory designed to expose `keymessage` events to event
+   * handlers that are not necessarily instances of [MediaKeySession].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaKeySession.webkitkeymessageEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -16734,14 +18222,17 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaKeySession_removeEventListener_Callback";
 
+  /// Stream of `keyadded` events handled by this [MediaKeySession].
   @DomName('MediaKeySession.onwebkitkeyadded')
   @DocsEditable()
   Stream<MediaKeyEvent> get onKeyAdded => keyAddedEvent.forTarget(this);
 
+  /// Stream of `keyerror` events handled by this [MediaKeySession].
   @DomName('MediaKeySession.onwebkitkeyerror')
   @DocsEditable()
   Stream<MediaKeyEvent> get onKeyError => keyErrorEvent.forTarget(this);
 
+  /// Stream of `keymessage` events handled by this [MediaKeySession].
   @DomName('MediaKeySession.onwebkitkeymessage')
   @DocsEditable()
   Stream<MediaKeyEvent> get onKeyMessage => keyMessageEvent.forTarget(this);
@@ -16955,14 +18446,32 @@
   // To suppress missing implicit constructor warnings.
   factory MediaStream._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `addtrack` events to event
+   * handlers that are not necessarily instances of [MediaStream].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStream.addtrackEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> addTrackEvent = const EventStreamProvider<Event>('addtrack');
 
+  /**
+   * Static factory designed to expose `ended` events to event
+   * handlers that are not necessarily instances of [MediaStream].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStream.endedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
 
+  /**
+   * Static factory designed to expose `removetrack` events to event
+   * handlers that are not necessarily instances of [MediaStream].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStream.removetrackEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> removeTrackEvent = const EventStreamProvider<Event>('removetrack');
@@ -17040,14 +18549,17 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStream_removeEventListener_Callback";
 
+  /// Stream of `addtrack` events handled by this [MediaStream].
   @DomName('MediaStream.onaddtrack')
   @DocsEditable()
   Stream<Event> get onAddTrack => addTrackEvent.forTarget(this);
 
+  /// Stream of `ended` events handled by this [MediaStream].
   @DomName('MediaStream.onended')
   @DocsEditable()
   Stream<Event> get onEnded => endedEvent.forTarget(this);
 
+  /// Stream of `removetrack` events handled by this [MediaStream].
   @DomName('MediaStream.onremovetrack')
   @DocsEditable()
   Stream<Event> get onRemoveTrack => removeTrackEvent.forTarget(this);
@@ -17102,14 +18614,32 @@
   // To suppress missing implicit constructor warnings.
   factory MediaStreamTrack._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `ended` events to event
+   * handlers that are not necessarily instances of [MediaStreamTrack].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStreamTrack.endedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
 
+  /**
+   * Static factory designed to expose `mute` events to event
+   * handlers that are not necessarily instances of [MediaStreamTrack].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStreamTrack.muteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> muteEvent = const EventStreamProvider<Event>('mute');
 
+  /**
+   * Static factory designed to expose `unmute` events to event
+   * handlers that are not necessarily instances of [MediaStreamTrack].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStreamTrack.unmuteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> unmuteEvent = const EventStreamProvider<Event>('unmute');
@@ -17162,14 +18692,17 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrack_removeEventListener_Callback";
 
+  /// Stream of `ended` events handled by this [MediaStreamTrack].
   @DomName('MediaStreamTrack.onended')
   @DocsEditable()
   Stream<Event> get onEnded => endedEvent.forTarget(this);
 
+  /// Stream of `mute` events handled by this [MediaStreamTrack].
   @DomName('MediaStreamTrack.onmute')
   @DocsEditable()
   Stream<Event> get onMute => muteEvent.forTarget(this);
 
+  /// Stream of `unmute` events handled by this [MediaStreamTrack].
   @DomName('MediaStreamTrack.onunmute')
   @DocsEditable()
   Stream<Event> get onUnmute => unmuteEvent.forTarget(this);
@@ -17353,6 +18886,12 @@
   // To suppress missing implicit constructor warnings.
   factory MessagePort._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [MessagePort].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MessagePort.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
@@ -17381,6 +18920,7 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "MessagePort_removeEventListener_Callback";
 
+  /// Stream of `message` events handled by this [MessagePort].
   @DomName('MessagePort.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
@@ -17568,10 +19108,22 @@
   // To suppress missing implicit constructor warnings.
   factory MidiAccess._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `connect` events to event
+   * handlers that are not necessarily instances of [MidiAccess].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MIDIAccess.connectEvent')
   @DocsEditable()
   static const EventStreamProvider<MidiConnectionEvent> connectEvent = const EventStreamProvider<MidiConnectionEvent>('connect');
 
+  /**
+   * Static factory designed to expose `disconnect` events to event
+   * handlers that are not necessarily instances of [MidiAccess].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MIDIAccess.disconnectEvent')
   @DocsEditable()
   static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
@@ -17596,10 +19148,12 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "MIDIAccess_removeEventListener_Callback";
 
+  /// Stream of `connect` events handled by this [MidiAccess].
   @DomName('MIDIAccess.onconnect')
   @DocsEditable()
   Stream<MidiConnectionEvent> get onConnect => connectEvent.forTarget(this);
 
+  /// Stream of `disconnect` events handled by this [MidiAccess].
   @DomName('MIDIAccess.ondisconnect')
   @DocsEditable()
   Stream<MidiConnectionEvent> get onDisconnect => disconnectEvent.forTarget(this);
@@ -17660,10 +19214,17 @@
   // To suppress missing implicit constructor warnings.
   factory MidiInput._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `midimessage` events to event
+   * handlers that are not necessarily instances of [MidiInput].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MIDIInput.midimessageEvent')
   @DocsEditable()
   static const EventStreamProvider<MidiMessageEvent> midiMessageEvent = const EventStreamProvider<MidiMessageEvent>('midimessage');
 
+  /// Stream of `midimessage` events handled by this [MidiInput].
   @DomName('MIDIInput.onmidimessage')
   @DocsEditable()
   Stream<MidiMessageEvent> get onMidiMessage => midiMessageEvent.forTarget(this);
@@ -17737,6 +19298,12 @@
   // To suppress missing implicit constructor warnings.
   factory MidiPort._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `disconnect` events to event
+   * handlers that are not necessarily instances of [MidiPort].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MIDIPort.disconnectEvent')
   @DocsEditable()
   static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
@@ -17773,6 +19340,7 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "MIDIPort_removeEventListener_Callback";
 
+  /// Stream of `disconnect` events handled by this [MidiPort].
   @DomName('MIDIPort.ondisconnect')
   @DocsEditable()
   Stream<MidiConnectionEvent> get onDisconnect => disconnectEvent.forTarget(this);
@@ -19222,23 +20790,53 @@
   // To suppress missing implicit constructor warnings.
   factory Notification._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `click` events to event
+   * handlers that are not necessarily instances of [Notification].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Notification.clickEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> clickEvent = const EventStreamProvider<Event>('click');
 
+  /**
+   * Static factory designed to expose `close` events to event
+   * handlers that are not necessarily instances of [Notification].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Notification.closeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> closeEvent = const EventStreamProvider<Event>('close');
 
+  /**
+   * Static factory designed to expose `display` events to event
+   * handlers that are not necessarily instances of [Notification].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Notification.displayEvent')
   @DocsEditable()
   @Experimental() // nonstandard
   static const EventStreamProvider<Event> displayEvent = const EventStreamProvider<Event>('display');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Notification].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Notification.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `show` events to event
+   * handlers that are not necessarily instances of [Notification].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Notification.showEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> showEvent = const EventStreamProvider<Event>('show');
@@ -19323,23 +20921,28 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "Notification_removeEventListener_Callback";
 
+  /// Stream of `click` events handled by this [Notification].
   @DomName('Notification.onclick')
   @DocsEditable()
   Stream<Event> get onClick => clickEvent.forTarget(this);
 
+  /// Stream of `close` events handled by this [Notification].
   @DomName('Notification.onclose')
   @DocsEditable()
   Stream<Event> get onClose => closeEvent.forTarget(this);
 
+  /// Stream of `display` events handled by this [Notification].
   @DomName('Notification.ondisplay')
   @DocsEditable()
   @Experimental() // nonstandard
   Stream<Event> get onDisplay => displayEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [Notification].
   @DomName('Notification.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `show` events handled by this [Notification].
   @DomName('Notification.onshow')
   @DocsEditable()
   Stream<Event> get onShow => showEvent.forTarget(this);
@@ -19968,6 +21571,12 @@
   // To suppress missing implicit constructor warnings.
   factory Performance._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `resourcetimingbufferfull` events to event
+   * handlers that are not necessarily instances of [Performance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Performance.webkitresourcetimingbufferfullEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -20069,6 +21678,7 @@
   @Experimental() // untriaged
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "Performance_removeEventListener_Callback";
 
+  /// Stream of `resourcetimingbufferfull` events handled by this [Performance].
   @DomName('Performance.onwebkitresourcetimingbufferfull')
   @DocsEditable()
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
@@ -21044,18 +22654,42 @@
   // To suppress missing implicit constructor warnings.
   factory RtcDataChannel._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `close` events to event
+   * handlers that are not necessarily instances of [RtcDataChannel].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCDataChannel.closeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> closeEvent = const EventStreamProvider<Event>('close');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [RtcDataChannel].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCDataChannel.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [RtcDataChannel].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCDataChannel.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+  /**
+   * Static factory designed to expose `open` events to event
+   * handlers that are not necessarily instances of [RtcDataChannel].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCDataChannel.openEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
@@ -21174,18 +22808,22 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDataChannel_removeEventListener_Callback";
 
+  /// Stream of `close` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onclose')
   @DocsEditable()
   Stream<Event> get onClose => closeEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `message` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
+  /// Stream of `open` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onopen')
   @DocsEditable()
   Stream<Event> get onOpen => openEvent.forTarget(this);
@@ -21226,6 +22864,12 @@
   // To suppress missing implicit constructor warnings.
   factory RtcDtmfSender._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `tonechange` events to event
+   * handlers that are not necessarily instances of [RtcDtmfSender].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCDTMFSender.tonechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<RtcDtmfToneChangeEvent> toneChangeEvent = const EventStreamProvider<RtcDtmfToneChangeEvent>('tonechange');
@@ -21281,6 +22925,7 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDTMFSender_removeEventListener_Callback";
 
+  /// Stream of `tonechange` events handled by this [RtcDtmfSender].
   @DomName('RTCDTMFSender.ontonechange')
   @DocsEditable()
   Stream<RtcDtmfToneChangeEvent> get onToneChange => toneChangeEvent.forTarget(this);
@@ -21405,30 +23050,72 @@
   // To suppress missing implicit constructor warnings.
   factory RtcPeerConnection._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `addstream` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.addstreamEvent')
   @DocsEditable()
   static const EventStreamProvider<MediaStreamEvent> addStreamEvent = const EventStreamProvider<MediaStreamEvent>('addstream');
 
+  /**
+   * Static factory designed to expose `datachannel` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.datachannelEvent')
   @DocsEditable()
   static const EventStreamProvider<RtcDataChannelEvent> dataChannelEvent = const EventStreamProvider<RtcDataChannelEvent>('datachannel');
 
+  /**
+   * Static factory designed to expose `icecandidate` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.icecandidateEvent')
   @DocsEditable()
   static const EventStreamProvider<RtcIceCandidateEvent> iceCandidateEvent = const EventStreamProvider<RtcIceCandidateEvent>('icecandidate');
 
+  /**
+   * Static factory designed to expose `iceconnectionstatechange` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.iceconnectionstatechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> iceConnectionStateChangeEvent = const EventStreamProvider<Event>('iceconnectionstatechange');
 
+  /**
+   * Static factory designed to expose `negotiationneeded` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.negotiationneededEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> negotiationNeededEvent = const EventStreamProvider<Event>('negotiationneeded');
 
+  /**
+   * Static factory designed to expose `removestream` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.removestreamEvent')
   @DocsEditable()
   static const EventStreamProvider<MediaStreamEvent> removeStreamEvent = const EventStreamProvider<MediaStreamEvent>('removestream');
 
+  /**
+   * Static factory designed to expose `signalingstatechange` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.signalingstatechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> signalingStateChangeEvent = const EventStreamProvider<Event>('signalingstatechange');
@@ -21550,30 +23237,37 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCPeerConnection_removeEventListener_Callback";
 
+  /// Stream of `addstream` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onaddstream')
   @DocsEditable()
   Stream<MediaStreamEvent> get onAddStream => addStreamEvent.forTarget(this);
 
+  /// Stream of `datachannel` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.ondatachannel')
   @DocsEditable()
   Stream<RtcDataChannelEvent> get onDataChannel => dataChannelEvent.forTarget(this);
 
+  /// Stream of `icecandidate` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onicecandidate')
   @DocsEditable()
   Stream<RtcIceCandidateEvent> get onIceCandidate => iceCandidateEvent.forTarget(this);
 
+  /// Stream of `iceconnectionstatechange` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.oniceconnectionstatechange')
   @DocsEditable()
   Stream<Event> get onIceConnectionStateChange => iceConnectionStateChangeEvent.forTarget(this);
 
+  /// Stream of `negotiationneeded` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onnegotiationneeded')
   @DocsEditable()
   Stream<Event> get onNegotiationNeeded => negotiationNeededEvent.forTarget(this);
 
+  /// Stream of `removestream` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onremovestream')
   @DocsEditable()
   Stream<MediaStreamEvent> get onRemoveStream => removeStreamEvent.forTarget(this);
 
+  /// Stream of `signalingstatechange` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onsignalingstatechange')
   @DocsEditable()
   Stream<Event> get onSignalingStateChange => signalingStateChangeEvent.forTarget(this);
@@ -22395,6 +24089,12 @@
   // To suppress missing implicit constructor warnings.
   factory SharedWorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `connect` events to event
+   * handlers that are not necessarily instances of [SharedWorkerGlobalScope].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SharedWorkerGlobalScope.connectEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -22405,6 +24105,7 @@
   @Experimental() // untriaged
   String get name native "SharedWorkerGlobalScope_name_Getter";
 
+  /// Stream of `connect` events handled by this [SharedWorkerGlobalScope].
   @DomName('SharedWorkerGlobalScope.onconnect')
   @DocsEditable()
   @Experimental() // untriaged
@@ -22904,46 +24605,112 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechRecognition._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `audioend` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.audioendEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> audioEndEvent = const EventStreamProvider<Event>('audioend');
 
+  /**
+   * Static factory designed to expose `audiostart` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.audiostartEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> audioStartEvent = const EventStreamProvider<Event>('audiostart');
 
+  /**
+   * Static factory designed to expose `end` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.endEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> endEvent = const EventStreamProvider<Event>('end');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechRecognitionError> errorEvent = const EventStreamProvider<SpeechRecognitionError>('error');
 
+  /**
+   * Static factory designed to expose `nomatch` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.nomatchEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechRecognitionEvent> noMatchEvent = const EventStreamProvider<SpeechRecognitionEvent>('nomatch');
 
+  /**
+   * Static factory designed to expose `result` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.resultEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechRecognitionEvent> resultEvent = const EventStreamProvider<SpeechRecognitionEvent>('result');
 
+  /**
+   * Static factory designed to expose `soundend` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.soundendEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> soundEndEvent = const EventStreamProvider<Event>('soundend');
 
+  /**
+   * Static factory designed to expose `soundstart` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.soundstartEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> soundStartEvent = const EventStreamProvider<Event>('soundstart');
 
+  /**
+   * Static factory designed to expose `speechend` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.speechendEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> speechEndEvent = const EventStreamProvider<Event>('speechend');
 
+  /**
+   * Static factory designed to expose `speechstart` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.speechstartEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> speechStartEvent = const EventStreamProvider<Event>('speechstart');
 
+  /**
+   * Static factory designed to expose `start` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.startEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> startEvent = const EventStreamProvider<Event>('start');
@@ -23024,46 +24791,57 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechRecognition_removeEventListener_Callback";
 
+  /// Stream of `audioend` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onaudioend')
   @DocsEditable()
   Stream<Event> get onAudioEnd => audioEndEvent.forTarget(this);
 
+  /// Stream of `audiostart` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onaudiostart')
   @DocsEditable()
   Stream<Event> get onAudioStart => audioStartEvent.forTarget(this);
 
+  /// Stream of `end` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onend')
   @DocsEditable()
   Stream<Event> get onEnd => endEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onerror')
   @DocsEditable()
   Stream<SpeechRecognitionError> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `nomatch` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onnomatch')
   @DocsEditable()
   Stream<SpeechRecognitionEvent> get onNoMatch => noMatchEvent.forTarget(this);
 
+  /// Stream of `result` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onresult')
   @DocsEditable()
   Stream<SpeechRecognitionEvent> get onResult => resultEvent.forTarget(this);
 
+  /// Stream of `soundend` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onsoundend')
   @DocsEditable()
   Stream<Event> get onSoundEnd => soundEndEvent.forTarget(this);
 
+  /// Stream of `soundstart` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onsoundstart')
   @DocsEditable()
   Stream<Event> get onSoundStart => soundStartEvent.forTarget(this);
 
+  /// Stream of `speechend` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onspeechend')
   @DocsEditable()
   Stream<Event> get onSpeechEnd => speechEndEvent.forTarget(this);
 
+  /// Stream of `speechstart` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onspeechstart')
   @DocsEditable()
   Stream<Event> get onSpeechStart => speechStartEvent.forTarget(this);
 
+  /// Stream of `start` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onstart')
   @DocsEditable()
   Stream<Event> get onStart => startEvent.forTarget(this);
@@ -23272,30 +25050,72 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechSynthesisUtterance._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `boundary` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.boundaryEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> boundaryEvent = const EventStreamProvider<SpeechSynthesisEvent>('boundary');
 
+  /**
+   * Static factory designed to expose `end` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.endEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> endEvent = const EventStreamProvider<SpeechSynthesisEvent>('end');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `mark` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.markEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> markEvent = const EventStreamProvider<SpeechSynthesisEvent>('mark');
 
+  /**
+   * Static factory designed to expose `pause` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.pauseEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
 
+  /**
+   * Static factory designed to expose `resume` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.resumeEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> resumeEvent = const EventStreamProvider<SpeechSynthesisEvent>('resume');
 
+  /**
+   * Static factory designed to expose `start` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.startEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> startEvent = const EventStreamProvider<SpeechSynthesisEvent>('start');
@@ -23372,30 +25192,37 @@
   @Experimental() // untriaged
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechSynthesisUtterance_removeEventListener_Callback";
 
+  /// Stream of `boundary` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onboundary')
   @DocsEditable()
   Stream<SpeechSynthesisEvent> get onBoundary => boundaryEvent.forTarget(this);
 
+  /// Stream of `end` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onend')
   @DocsEditable()
   Stream<SpeechSynthesisEvent> get onEnd => endEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `mark` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onmark')
   @DocsEditable()
   Stream<SpeechSynthesisEvent> get onMark => markEvent.forTarget(this);
 
+  /// Stream of `pause` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onpause')
   @DocsEditable()
   Stream<Event> get onPause => pauseEvent.forTarget(this);
 
+  /// Stream of `resume` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onresume')
   @DocsEditable()
   Stream<SpeechSynthesisEvent> get onResume => resumeEvent.forTarget(this);
 
+  /// Stream of `start` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onstart')
   @DocsEditable()
   Stream<SpeechSynthesisEvent> get onStart => startEvent.forTarget(this);
@@ -24590,6 +26417,12 @@
   // To suppress missing implicit constructor warnings.
   factory TextTrack._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `cuechange` events to event
+   * handlers that are not necessarily instances of [TextTrack].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('TextTrack.cuechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> cueChangeEvent = const EventStreamProvider<Event>('cuechange');
@@ -24642,6 +26475,7 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrack_removeEventListener_Callback";
 
+  /// Stream of `cuechange` events handled by this [TextTrack].
   @DomName('TextTrack.oncuechange')
   @DocsEditable()
   Stream<Event> get onCueChange => cueChangeEvent.forTarget(this);
@@ -24662,10 +26496,22 @@
   // To suppress missing implicit constructor warnings.
   factory TextTrackCue._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `enter` events to event
+   * handlers that are not necessarily instances of [TextTrackCue].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('TextTrackCue.enterEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> enterEvent = const EventStreamProvider<Event>('enter');
 
+  /**
+   * Static factory designed to expose `exit` events to event
+   * handlers that are not necessarily instances of [TextTrackCue].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('TextTrackCue.exitEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> exitEvent = const EventStreamProvider<Event>('exit');
@@ -24802,10 +26648,12 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackCue_removeEventListener_Callback";
 
+  /// Stream of `enter` events handled by this [TextTrackCue].
   @DomName('TextTrackCue.onenter')
   @DocsEditable()
   Stream<Event> get onEnter => enterEvent.forTarget(this);
 
+  /// Stream of `exit` events handled by this [TextTrackCue].
   @DomName('TextTrackCue.onexit')
   @DocsEditable()
   Stream<Event> get onExit => exitEvent.forTarget(this);
@@ -24899,6 +26747,12 @@
   // To suppress missing implicit constructor warnings.
   factory TextTrackList._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `addtrack` events to event
+   * handlers that are not necessarily instances of [TextTrackList].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('TextTrackList.addtrackEvent')
   @DocsEditable()
   static const EventStreamProvider<TrackEvent> addTrackEvent = const EventStreamProvider<TrackEvent>('addtrack');
@@ -24968,6 +26822,7 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackList_removeEventListener_Callback";
 
+  /// Stream of `addtrack` events handled by this [TextTrackList].
   @DomName('TextTrackList.onaddtrack')
   @DocsEditable()
   Stream<TrackEvent> get onAddTrack => addTrackEvent.forTarget(this);
@@ -25626,13 +27481,13 @@
     if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
       return _createObjectURL_1(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
+    if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
       return _createObjectURL_2(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is _WebKitMediaSource || blob_OR_source_OR_stream == null)) {
+    if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
       return _createObjectURL_3(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
+    if ((blob_OR_source_OR_stream is _WebKitMediaSource || blob_OR_source_OR_stream == null)) {
       return _createObjectURL_4(blob_OR_source_OR_stream);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -25863,18 +27718,42 @@
   // To suppress missing implicit constructor warnings.
   factory WebSocket._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `close` events to event
+   * handlers that are not necessarily instances of [WebSocket].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('WebSocket.closeEvent')
   @DocsEditable()
   static const EventStreamProvider<CloseEvent> closeEvent = const EventStreamProvider<CloseEvent>('close');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [WebSocket].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('WebSocket.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [WebSocket].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('WebSocket.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+  /**
+   * Static factory designed to expose `open` events to event
+   * handlers that are not necessarily instances of [WebSocket].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('WebSocket.openEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
@@ -26008,18 +27887,22 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "WebSocket_removeEventListener_Callback";
 
+  /// Stream of `close` events handled by this [WebSocket].
   @DomName('WebSocket.onclose')
   @DocsEditable()
   Stream<CloseEvent> get onClose => closeEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [WebSocket].
   @DomName('WebSocket.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `message` events handled by this [WebSocket].
   @DomName('WebSocket.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
+  /// Stream of `open` events handled by this [WebSocket].
   @DomName('WebSocket.onopen')
   @DocsEditable()
   Stream<Event> get onOpen => openEvent.forTarget(this);
@@ -26296,62 +28179,146 @@
   // To suppress missing implicit constructor warnings.
   factory Window._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `contentloaded` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.DOMContentLoadedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> contentLoadedEvent = const EventStreamProvider<Event>('DOMContentLoaded');
 
+  /**
+   * Static factory designed to expose `devicemotion` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.devicemotionEvent')
   @DocsEditable()
   // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
   @Experimental()
   static const EventStreamProvider<DeviceMotionEvent> deviceMotionEvent = const EventStreamProvider<DeviceMotionEvent>('devicemotion');
 
+  /**
+   * Static factory designed to expose `deviceorientation` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.deviceorientationEvent')
   @DocsEditable()
   // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
   @Experimental()
   static const EventStreamProvider<DeviceOrientationEvent> deviceOrientationEvent = const EventStreamProvider<DeviceOrientationEvent>('deviceorientation');
 
+  /**
+   * Static factory designed to expose `hashchange` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.hashchangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> hashChangeEvent = const EventStreamProvider<Event>('hashchange');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+  /**
+   * Static factory designed to expose `offline` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.offlineEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> offlineEvent = const EventStreamProvider<Event>('offline');
 
+  /**
+   * Static factory designed to expose `online` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.onlineEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> onlineEvent = const EventStreamProvider<Event>('online');
 
+  /**
+   * Static factory designed to expose `pagehide` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.pagehideEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pageHideEvent = const EventStreamProvider<Event>('pagehide');
 
+  /**
+   * Static factory designed to expose `pageshow` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.pageshowEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pageShowEvent = const EventStreamProvider<Event>('pageshow');
 
+  /**
+   * Static factory designed to expose `popstate` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.popstateEvent')
   @DocsEditable()
   static const EventStreamProvider<PopStateEvent> popStateEvent = const EventStreamProvider<PopStateEvent>('popstate');
 
+  /**
+   * Static factory designed to expose `resize` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.resizeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
 
+  /**
+   * Static factory designed to expose `storage` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.storageEvent')
   @DocsEditable()
   static const EventStreamProvider<StorageEvent> storageEvent = const EventStreamProvider<StorageEvent>('storage');
 
+  /**
+   * Static factory designed to expose `unload` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.unloadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
 
+  /**
+   * Static factory designed to expose `animationend` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.webkitAnimationEndEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -26359,6 +28326,12 @@
   @Experimental()
   static const EventStreamProvider<AnimationEvent> animationEndEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationEnd');
 
+  /**
+   * Static factory designed to expose `animationiteration` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.webkitAnimationIterationEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -26366,6 +28339,12 @@
   @Experimental()
   static const EventStreamProvider<AnimationEvent> animationIterationEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationIteration');
 
+  /**
+   * Static factory designed to expose `animationstart` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.webkitAnimationStartEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -26794,253 +28773,313 @@
   @DocsEditable()
   int _setTimeout(Object handler, int timeout) native "Window_setTimeout_Callback";
 
+  /// Stream of `contentloaded` events handled by this [Window].
   @DomName('Window.onDOMContentLoaded')
   @DocsEditable()
   Stream<Event> get onContentLoaded => contentLoadedEvent.forTarget(this);
 
+  /// Stream of `abort` events handled by this [Window].
   @DomName('Window.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => Element.abortEvent.forTarget(this);
 
+  /// Stream of `blur` events handled by this [Window].
   @DomName('Window.onblur')
   @DocsEditable()
   Stream<Event> get onBlur => Element.blurEvent.forTarget(this);
 
+  /// Stream of `change` events handled by this [Window].
   @DomName('Window.onchange')
   @DocsEditable()
   Stream<Event> get onChange => Element.changeEvent.forTarget(this);
 
+  /// Stream of `click` events handled by this [Window].
   @DomName('Window.onclick')
   @DocsEditable()
   Stream<MouseEvent> get onClick => Element.clickEvent.forTarget(this);
 
+  /// Stream of `contextmenu` events handled by this [Window].
   @DomName('Window.oncontextmenu')
   @DocsEditable()
   Stream<MouseEvent> get onContextMenu => Element.contextMenuEvent.forTarget(this);
 
+  /// Stream of `doubleclick` events handled by this [Window].
   @DomName('Window.ondblclick')
   @DocsEditable()
   Stream<Event> get onDoubleClick => Element.doubleClickEvent.forTarget(this);
 
+  /// Stream of `devicemotion` events handled by this [Window].
   @DomName('Window.ondevicemotion')
   @DocsEditable()
   // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
   @Experimental()
   Stream<DeviceMotionEvent> get onDeviceMotion => deviceMotionEvent.forTarget(this);
 
+  /// Stream of `deviceorientation` events handled by this [Window].
   @DomName('Window.ondeviceorientation')
   @DocsEditable()
   // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
   @Experimental()
   Stream<DeviceOrientationEvent> get onDeviceOrientation => deviceOrientationEvent.forTarget(this);
 
+  /// Stream of `drag` events handled by this [Window].
   @DomName('Window.ondrag')
   @DocsEditable()
   Stream<MouseEvent> get onDrag => Element.dragEvent.forTarget(this);
 
+  /// Stream of `dragend` events handled by this [Window].
   @DomName('Window.ondragend')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnd => Element.dragEndEvent.forTarget(this);
 
+  /// Stream of `dragenter` events handled by this [Window].
   @DomName('Window.ondragenter')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnter => Element.dragEnterEvent.forTarget(this);
 
+  /// Stream of `dragleave` events handled by this [Window].
   @DomName('Window.ondragleave')
   @DocsEditable()
   Stream<MouseEvent> get onDragLeave => Element.dragLeaveEvent.forTarget(this);
 
+  /// Stream of `dragover` events handled by this [Window].
   @DomName('Window.ondragover')
   @DocsEditable()
   Stream<MouseEvent> get onDragOver => Element.dragOverEvent.forTarget(this);
 
+  /// Stream of `dragstart` events handled by this [Window].
   @DomName('Window.ondragstart')
   @DocsEditable()
   Stream<MouseEvent> get onDragStart => Element.dragStartEvent.forTarget(this);
 
+  /// Stream of `drop` events handled by this [Window].
   @DomName('Window.ondrop')
   @DocsEditable()
   Stream<MouseEvent> get onDrop => Element.dropEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [Window].
   @DomName('Window.onerror')
   @DocsEditable()
   Stream<Event> get onError => Element.errorEvent.forTarget(this);
 
+  /// Stream of `focus` events handled by this [Window].
   @DomName('Window.onfocus')
   @DocsEditable()
   Stream<Event> get onFocus => Element.focusEvent.forTarget(this);
 
+  /// Stream of `hashchange` events handled by this [Window].
   @DomName('Window.onhashchange')
   @DocsEditable()
   Stream<Event> get onHashChange => hashChangeEvent.forTarget(this);
 
+  /// Stream of `input` events handled by this [Window].
   @DomName('Window.oninput')
   @DocsEditable()
   Stream<Event> get onInput => Element.inputEvent.forTarget(this);
 
+  /// Stream of `invalid` events handled by this [Window].
   @DomName('Window.oninvalid')
   @DocsEditable()
   Stream<Event> get onInvalid => Element.invalidEvent.forTarget(this);
 
+  /// Stream of `keydown` events handled by this [Window].
   @DomName('Window.onkeydown')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyDown => Element.keyDownEvent.forTarget(this);
 
+  /// Stream of `keypress` events handled by this [Window].
   @DomName('Window.onkeypress')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyPress => Element.keyPressEvent.forTarget(this);
 
+  /// Stream of `keyup` events handled by this [Window].
   @DomName('Window.onkeyup')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyUp => Element.keyUpEvent.forTarget(this);
 
+  /// Stream of `load` events handled by this [Window].
   @DomName('Window.onload')
   @DocsEditable()
   Stream<Event> get onLoad => Element.loadEvent.forTarget(this);
 
+  /// Stream of `message` events handled by this [Window].
   @DomName('Window.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
+  /// Stream of `mousedown` events handled by this [Window].
   @DomName('Window.onmousedown')
   @DocsEditable()
   Stream<MouseEvent> get onMouseDown => Element.mouseDownEvent.forTarget(this);
 
+  /// Stream of `mouseenter` events handled by this [Window].
   @DomName('Window.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseEnter => Element.mouseEnterEvent.forTarget(this);
 
+  /// Stream of `mouseleave` events handled by this [Window].
   @DomName('Window.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseLeave => Element.mouseLeaveEvent.forTarget(this);
 
+  /// Stream of `mousemove` events handled by this [Window].
   @DomName('Window.onmousemove')
   @DocsEditable()
   Stream<MouseEvent> get onMouseMove => Element.mouseMoveEvent.forTarget(this);
 
+  /// Stream of `mouseout` events handled by this [Window].
   @DomName('Window.onmouseout')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOut => Element.mouseOutEvent.forTarget(this);
 
+  /// Stream of `mouseover` events handled by this [Window].
   @DomName('Window.onmouseover')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOver => Element.mouseOverEvent.forTarget(this);
 
+  /// Stream of `mouseup` events handled by this [Window].
   @DomName('Window.onmouseup')
   @DocsEditable()
   Stream<MouseEvent> get onMouseUp => Element.mouseUpEvent.forTarget(this);
 
+  /// Stream of `mousewheel` events handled by this [Window].
   @DomName('Window.onmousewheel')
   @DocsEditable()
   Stream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent.forTarget(this);
 
+  /// Stream of `offline` events handled by this [Window].
   @DomName('Window.onoffline')
   @DocsEditable()
   Stream<Event> get onOffline => offlineEvent.forTarget(this);
 
+  /// Stream of `online` events handled by this [Window].
   @DomName('Window.ononline')
   @DocsEditable()
   Stream<Event> get onOnline => onlineEvent.forTarget(this);
 
+  /// Stream of `pagehide` events handled by this [Window].
   @DomName('Window.onpagehide')
   @DocsEditable()
   Stream<Event> get onPageHide => pageHideEvent.forTarget(this);
 
+  /// Stream of `pageshow` events handled by this [Window].
   @DomName('Window.onpageshow')
   @DocsEditable()
   Stream<Event> get onPageShow => pageShowEvent.forTarget(this);
 
+  /// Stream of `popstate` events handled by this [Window].
   @DomName('Window.onpopstate')
   @DocsEditable()
   Stream<PopStateEvent> get onPopState => popStateEvent.forTarget(this);
 
+  /// Stream of `reset` events handled by this [Window].
   @DomName('Window.onreset')
   @DocsEditable()
   Stream<Event> get onReset => Element.resetEvent.forTarget(this);
 
+  /// Stream of `resize` events handled by this [Window].
   @DomName('Window.onresize')
   @DocsEditable()
   Stream<Event> get onResize => resizeEvent.forTarget(this);
 
+  /// Stream of `scroll` events handled by this [Window].
   @DomName('Window.onscroll')
   @DocsEditable()
   Stream<Event> get onScroll => Element.scrollEvent.forTarget(this);
 
+  /// Stream of `search` events handled by this [Window].
   @DomName('Window.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   Stream<Event> get onSearch => Element.searchEvent.forTarget(this);
 
+  /// Stream of `select` events handled by this [Window].
   @DomName('Window.onselect')
   @DocsEditable()
   Stream<Event> get onSelect => Element.selectEvent.forTarget(this);
 
+  /// Stream of `storage` events handled by this [Window].
   @DomName('Window.onstorage')
   @DocsEditable()
   Stream<StorageEvent> get onStorage => storageEvent.forTarget(this);
 
+  /// Stream of `submit` events handled by this [Window].
   @DomName('Window.onsubmit')
   @DocsEditable()
   Stream<Event> get onSubmit => Element.submitEvent.forTarget(this);
 
+  /// Stream of `touchcancel` events handled by this [Window].
   @DomName('Window.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchCancel => Element.touchCancelEvent.forTarget(this);
 
+  /// Stream of `touchend` events handled by this [Window].
   @DomName('Window.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchEnd => Element.touchEndEvent.forTarget(this);
 
+  /// Stream of `touchmove` events handled by this [Window].
   @DomName('Window.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchMove => Element.touchMoveEvent.forTarget(this);
 
+  /// Stream of `touchstart` events handled by this [Window].
   @DomName('Window.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchStart => Element.touchStartEvent.forTarget(this);
 
+  /// Stream of `transitionend` events handled by this [Window].
   @DomName('Window.ontransitionend')
   @DocsEditable()
   Stream<TransitionEvent> get onTransitionEnd => Element.transitionEndEvent.forTarget(this);
 
+  /// Stream of `unload` events handled by this [Window].
   @DomName('Window.onunload')
   @DocsEditable()
   Stream<Event> get onUnload => unloadEvent.forTarget(this);
 
+  /// Stream of `animationend` events handled by this [Window].
   @DomName('Window.onwebkitAnimationEnd')
   @DocsEditable()
   @Experimental()
   Stream<AnimationEvent> get onAnimationEnd => animationEndEvent.forTarget(this);
 
+  /// Stream of `animationiteration` events handled by this [Window].
   @DomName('Window.onwebkitAnimationIteration')
   @DocsEditable()
   @Experimental()
   Stream<AnimationEvent> get onAnimationIteration => animationIterationEvent.forTarget(this);
 
+  /// Stream of `animationstart` events handled by this [Window].
   @DomName('Window.onwebkitAnimationStart')
   @DocsEditable()
   @Experimental()
   Stream<AnimationEvent> get onAnimationStart => animationStartEvent.forTarget(this);
 
 
+  /**
+   * Static factory designed to expose `beforeunload` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.beforeunloadEvent')
-  @DocsEditable()
   static const EventStreamProvider<BeforeUnloadEvent> beforeUnloadEvent =
       const _BeforeUnloadEventStreamProvider('beforeunload');
 
+  /// Stream of `beforeunload` events handled by this [Window].
   @DomName('Window.onbeforeunload')
-  @DocsEditable()
   Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
 
   void moveTo(Point p) {
@@ -27049,17 +29088,6 @@
 
 }
 
-class _BeforeUnloadEvent extends _WrappedEvent implements BeforeUnloadEvent {
-  String _returnValue;
-
-  _BeforeUnloadEvent(Event base): super(base);
-
-  String get returnValue => _returnValue;
-
-  void set returnValue(String value) {
-    _returnValue = value;
-  }
-}
 
 class _BeforeUnloadEventStreamProvider implements
     EventStreamProvider<BeforeUnloadEvent> {
@@ -27068,15 +29096,8 @@
   const _BeforeUnloadEventStreamProvider(this._eventType);
 
   Stream<BeforeUnloadEvent> forTarget(EventTarget e, {bool useCapture: false}) {
-    var controller = new StreamController(sync: true);
     var stream = new _EventStream(e, _eventType, useCapture);
-    stream.listen((event) {
-      var wrapped = new _BeforeUnloadEvent(event);
-      controller.add(wrapped);
-      return wrapped.returnValue;
-    });
-
-    return controller.stream;
+    return stream;
   }
 
   String getEventType(EventTarget target) {
@@ -27127,11 +29148,23 @@
   // To suppress missing implicit constructor warnings.
   factory Worker._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Worker].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Worker.errorEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [Worker].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Worker.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
@@ -27171,11 +29204,13 @@
   @Experimental() // untriaged
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "Worker_removeEventListener_Callback";
 
+  /// Stream of `error` events handled by this [Worker].
   @DomName('Worker.onerror')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `message` events handled by this [Worker].
   @DomName('Worker.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
@@ -27230,6 +29265,12 @@
   // To suppress missing implicit constructor warnings.
   factory WorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [WorkerGlobalScope].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('WorkerGlobalScope.errorEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -27390,6 +29431,7 @@
   @Experimental() // untriaged
   int setTimeout(Object handler, int timeout) native "WorkerGlobalScope_setTimeout_Callback";
 
+  /// Stream of `error` events handled by this [WorkerGlobalScope].
   @DomName('WorkerGlobalScope.onerror')
   @DocsEditable()
   @Experimental() // untriaged
@@ -29273,6 +31315,54 @@
   factory _XMLHttpRequestProgressEvent._() { throw new UnsupportedError("Not supported"); }
 
 }
+// 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.
+
+
+/**
+ * Helper class to implement custom events which wrap DOM events.
+ */
+class _WrappedEvent implements Event {
+  final Event wrapped;
+  _WrappedEvent(this.wrapped);
+
+  bool get bubbles => wrapped.bubbles;
+
+  bool get cancelable => wrapped.cancelable;
+
+  DataTransfer get clipboardData => wrapped.clipboardData;
+
+  EventTarget get currentTarget => wrapped.currentTarget;
+
+  bool get defaultPrevented => wrapped.defaultPrevented;
+
+  int get eventPhase => wrapped.eventPhase;
+
+  EventTarget get target => wrapped.target;
+
+  int get timeStamp => wrapped.timeStamp;
+
+  String get type => wrapped.type;
+
+  void _initEvent(String eventTypeArg, bool canBubbleArg,
+      bool cancelableArg) {
+    throw new UnsupportedError(
+        'Cannot initialize this Event.');
+  }
+
+  void preventDefault() {
+    wrapped.preventDefault();
+  }
+
+  void stopImmediatePropagation() {
+    wrapped.stopImmediatePropagation();
+  }
+
+  void stopPropagation() {
+    wrapped.stopPropagation();
+  }
+}
 // 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.
@@ -33474,54 +35564,6 @@
 
 
 /**
- * Helper class to implement custom events which wrap DOM events.
- */
-class _WrappedEvent implements Event {
-  final Event wrapped;
-  _WrappedEvent(this.wrapped);
-
-  bool get bubbles => wrapped.bubbles;
-
-  bool get cancelable => wrapped.cancelable;
-
-  DataTransfer get clipboardData => wrapped.clipboardData;
-
-  EventTarget get currentTarget => wrapped.currentTarget;
-
-  bool get defaultPrevented => wrapped.defaultPrevented;
-
-  int get eventPhase => wrapped.eventPhase;
-
-  EventTarget get target => wrapped.target;
-
-  int get timeStamp => wrapped.timeStamp;
-
-  String get type => wrapped.type;
-
-  void _initEvent(String eventTypeArg, bool canBubbleArg,
-      bool cancelableArg) {
-    throw new UnsupportedError(
-        'Cannot initialize this Event.');
-  }
-
-  void preventDefault() {
-    wrapped.preventDefault();
-  }
-
-  void stopImmediatePropagation() {
-    wrapped.stopImmediatePropagation();
-  }
-
-  void stopPropagation() {
-    wrapped.stopPropagation();
-  }
-}
-// 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.
-
-
-/**
  * A list which just wraps another list, for either intercepting list calls or
  * retyping the list (for example, from List<A> to List<B> where B extends A).
  */
diff --git a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
index e5d187f..1068f9c 100644
--- a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
+++ b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
@@ -385,20 +385,44 @@
   // To suppress missing implicit constructor warnings.
   factory Database._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [Database].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBDatabase.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
 
+  /**
+   * Static factory designed to expose `close` events to event
+   * handlers that are not necessarily instances of [Database].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBDatabase.closeEvent')
   @DocsEditable()
   // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22540
   @Experimental()
   static const EventStreamProvider<Event> closeEvent = const EventStreamProvider<Event>('close');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Database].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBDatabase.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `versionchange` events to event
+   * handlers that are not necessarily instances of [Database].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBDatabase.versionchangeEvent')
   @DocsEditable()
   static const EventStreamProvider<VersionChangeEvent> versionChangeEvent = const EventStreamProvider<VersionChangeEvent>('versionchange');
@@ -445,20 +469,24 @@
   @DocsEditable()
   void deleteObjectStore(String name) native;
 
+  /// Stream of `abort` events handled by this [Database].
   @DomName('IDBDatabase.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `close` events handled by this [Database].
   @DomName('IDBDatabase.onclose')
   @DocsEditable()
   // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22540
   @Experimental()
   Stream<Event> get onClose => closeEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [Database].
   @DomName('IDBDatabase.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `versionchange` events handled by this [Database].
   @DomName('IDBDatabase.onversionchange')
   @DocsEditable()
   Stream<VersionChangeEvent> get onVersionChange => versionChangeEvent.forTarget(this);
@@ -1163,18 +1191,32 @@
   // To suppress missing implicit constructor warnings.
   factory OpenDBRequest._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `blocked` events to event
+   * handlers that are not necessarily instances of [OpenDBRequest].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBOpenDBRequest.blockedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> blockedEvent = const EventStreamProvider<Event>('blocked');
 
+  /**
+   * Static factory designed to expose `upgradeneeded` events to event
+   * handlers that are not necessarily instances of [OpenDBRequest].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBOpenDBRequest.upgradeneededEvent')
   @DocsEditable()
   static const EventStreamProvider<VersionChangeEvent> upgradeNeededEvent = const EventStreamProvider<VersionChangeEvent>('upgradeneeded');
 
+  /// Stream of `blocked` events handled by this [OpenDBRequest].
   @DomName('IDBOpenDBRequest.onblocked')
   @DocsEditable()
   Stream<Event> get onBlocked => blockedEvent.forTarget(this);
 
+  /// Stream of `upgradeneeded` events handled by this [OpenDBRequest].
   @DomName('IDBOpenDBRequest.onupgradeneeded')
   @DocsEditable()
   Stream<VersionChangeEvent> get onUpgradeNeeded => upgradeNeededEvent.forTarget(this);
@@ -1191,10 +1233,22 @@
   // To suppress missing implicit constructor warnings.
   factory Request._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Request].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBRequest.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `success` events to event
+   * handlers that are not necessarily instances of [Request].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBRequest.successEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> successEvent = const EventStreamProvider<Event>('success');
@@ -1225,10 +1279,12 @@
   @DocsEditable()
   final Transaction transaction;
 
+  /// Stream of `error` events handled by this [Request].
   @DomName('IDBRequest.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `success` events handled by this [Request].
   @DomName('IDBRequest.onsuccess')
   @DocsEditable()
   Stream<Event> get onSuccess => successEvent.forTarget(this);
@@ -1273,14 +1329,32 @@
   // To suppress missing implicit constructor warnings.
   factory Transaction._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [Transaction].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBTransaction.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
 
+  /**
+   * Static factory designed to expose `complete` events to event
+   * handlers that are not necessarily instances of [Transaction].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBTransaction.completeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> completeEvent = const EventStreamProvider<Event>('complete');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Transaction].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBTransaction.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
@@ -1305,14 +1379,17 @@
   @DocsEditable()
   ObjectStore objectStore(String name) native;
 
+  /// Stream of `abort` events handled by this [Transaction].
   @DomName('IDBTransaction.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `complete` events handled by this [Transaction].
   @DomName('IDBTransaction.oncomplete')
   @DocsEditable()
   Stream<Event> get onComplete => completeEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [Transaction].
   @DomName('IDBTransaction.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
diff --git a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
index 33a79bd..ae72ed0 100644
--- a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
+++ b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
@@ -151,20 +151,44 @@
   // To suppress missing implicit constructor warnings.
   factory Database._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [Database].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBDatabase.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
 
+  /**
+   * Static factory designed to expose `close` events to event
+   * handlers that are not necessarily instances of [Database].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBDatabase.closeEvent')
   @DocsEditable()
   // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22540
   @Experimental()
   static const EventStreamProvider<Event> closeEvent = const EventStreamProvider<Event>('close');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Database].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBDatabase.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `versionchange` events to event
+   * handlers that are not necessarily instances of [Database].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBDatabase.versionchangeEvent')
   @DocsEditable()
   static const EventStreamProvider<VersionChangeEvent> versionChangeEvent = const EventStreamProvider<VersionChangeEvent>('versionchange');
@@ -236,20 +260,24 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBDatabase_removeEventListener_Callback";
 
+  /// Stream of `abort` events handled by this [Database].
   @DomName('IDBDatabase.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `close` events handled by this [Database].
   @DomName('IDBDatabase.onclose')
   @DocsEditable()
   // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22540
   @Experimental()
   Stream<Event> get onClose => closeEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [Database].
   @DomName('IDBDatabase.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `versionchange` events handled by this [Database].
   @DomName('IDBDatabase.onversionchange')
   @DocsEditable()
   Stream<VersionChangeEvent> get onVersionChange => versionChangeEvent.forTarget(this);
@@ -841,18 +869,32 @@
   // To suppress missing implicit constructor warnings.
   factory OpenDBRequest._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `blocked` events to event
+   * handlers that are not necessarily instances of [OpenDBRequest].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBOpenDBRequest.blockedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> blockedEvent = const EventStreamProvider<Event>('blocked');
 
+  /**
+   * Static factory designed to expose `upgradeneeded` events to event
+   * handlers that are not necessarily instances of [OpenDBRequest].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBOpenDBRequest.upgradeneededEvent')
   @DocsEditable()
   static const EventStreamProvider<VersionChangeEvent> upgradeNeededEvent = const EventStreamProvider<VersionChangeEvent>('upgradeneeded');
 
+  /// Stream of `blocked` events handled by this [OpenDBRequest].
   @DomName('IDBOpenDBRequest.onblocked')
   @DocsEditable()
   Stream<Event> get onBlocked => blockedEvent.forTarget(this);
 
+  /// Stream of `upgradeneeded` events handled by this [OpenDBRequest].
   @DomName('IDBOpenDBRequest.onupgradeneeded')
   @DocsEditable()
   Stream<VersionChangeEvent> get onUpgradeNeeded => upgradeNeededEvent.forTarget(this);
@@ -872,10 +914,22 @@
   // To suppress missing implicit constructor warnings.
   factory Request._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Request].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBRequest.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `success` events to event
+   * handlers that are not necessarily instances of [Request].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBRequest.successEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> successEvent = const EventStreamProvider<Event>('success');
@@ -912,10 +966,12 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBRequest_removeEventListener_Callback";
 
+  /// Stream of `error` events handled by this [Request].
   @DomName('IDBRequest.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `success` events handled by this [Request].
   @DomName('IDBRequest.onsuccess')
   @DocsEditable()
   Stream<Event> get onSuccess => successEvent.forTarget(this);
@@ -961,14 +1017,32 @@
   // To suppress missing implicit constructor warnings.
   factory Transaction._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [Transaction].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBTransaction.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
 
+  /**
+   * Static factory designed to expose `complete` events to event
+   * handlers that are not necessarily instances of [Transaction].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBTransaction.completeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> completeEvent = const EventStreamProvider<Event>('complete');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Transaction].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBTransaction.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
@@ -1005,14 +1079,17 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBTransaction_removeEventListener_Callback";
 
+  /// Stream of `abort` events handled by this [Transaction].
   @DomName('IDBTransaction.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `complete` events handled by this [Transaction].
   @DomName('IDBTransaction.oncomplete')
   @DocsEditable()
   Stream<Event> get onComplete => completeEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [Transaction].
   @DomName('IDBTransaction.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
diff --git a/sdk/lib/svg/dart2js/svg_dart2js.dart b/sdk/lib/svg/dart2js/svg_dart2js.dart
index 1d51c92..d599314 100644
--- a/sdk/lib/svg/dart2js/svg_dart2js.dart
+++ b/sdk/lib/svg/dart2js/svg_dart2js.dart
@@ -708,174 +708,426 @@
   // To suppress missing implicit constructor warnings.
   factory ElementInstance._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
 
+  /**
+   * Static factory designed to expose `beforecopy` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.beforecopyEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforeCopyEvent = const EventStreamProvider<Event>('beforecopy');
 
+  /**
+   * Static factory designed to expose `beforecut` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.beforecutEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforeCutEvent = const EventStreamProvider<Event>('beforecut');
 
+  /**
+   * Static factory designed to expose `beforepaste` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.beforepasteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforePasteEvent = const EventStreamProvider<Event>('beforepaste');
 
+  /**
+   * Static factory designed to expose `blur` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.blurEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
 
+  /**
+   * Static factory designed to expose `change` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.changeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
 
+  /**
+   * Static factory designed to expose `click` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.clickEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> clickEvent = const EventStreamProvider<MouseEvent>('click');
 
+  /**
+   * Static factory designed to expose `contextmenu` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.contextmenuEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> contextMenuEvent = const EventStreamProvider<MouseEvent>('contextmenu');
 
+  /**
+   * Static factory designed to expose `copy` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.copyEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> copyEvent = const EventStreamProvider<Event>('copy');
 
+  /**
+   * Static factory designed to expose `cut` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.cutEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> cutEvent = const EventStreamProvider<Event>('cut');
 
+  /**
+   * Static factory designed to expose `doubleclick` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dblclickEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> doubleClickEvent = const EventStreamProvider<Event>('dblclick');
 
+  /**
+   * Static factory designed to expose `drag` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEvent = const EventStreamProvider<MouseEvent>('drag');
 
+  /**
+   * Static factory designed to expose `dragend` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragendEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEndEvent = const EventStreamProvider<MouseEvent>('dragend');
 
+  /**
+   * Static factory designed to expose `dragenter` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragenterEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEnterEvent = const EventStreamProvider<MouseEvent>('dragenter');
 
+  /**
+   * Static factory designed to expose `dragleave` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragleaveEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragLeaveEvent = const EventStreamProvider<MouseEvent>('dragleave');
 
+  /**
+   * Static factory designed to expose `dragover` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragoverEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragOverEvent = const EventStreamProvider<MouseEvent>('dragover');
 
+  /**
+   * Static factory designed to expose `dragstart` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragstartEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragStartEvent = const EventStreamProvider<MouseEvent>('dragstart');
 
+  /**
+   * Static factory designed to expose `drop` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dropEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dropEvent = const EventStreamProvider<MouseEvent>('drop');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `focus` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.focusEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
 
+  /**
+   * Static factory designed to expose `input` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.inputEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> inputEvent = const EventStreamProvider<Event>('input');
 
+  /**
+   * Static factory designed to expose `keydown` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.keydownEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyDownEvent = const EventStreamProvider<KeyboardEvent>('keydown');
 
+  /**
+   * Static factory designed to expose `keypress` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.keypressEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyPressEvent = const EventStreamProvider<KeyboardEvent>('keypress');
 
+  /**
+   * Static factory designed to expose `keyup` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.keyupEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyUpEvent = const EventStreamProvider<KeyboardEvent>('keyup');
 
+  /**
+   * Static factory designed to expose `load` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.loadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
 
+  /**
+   * Static factory designed to expose `mousedown` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mousedownEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseDownEvent = const EventStreamProvider<MouseEvent>('mousedown');
 
+  /**
+   * Static factory designed to expose `mouseenter` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mouseenterEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseEnterEvent = const EventStreamProvider<MouseEvent>('mouseenter');
 
+  /**
+   * Static factory designed to expose `mouseleave` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mouseleaveEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseLeaveEvent = const EventStreamProvider<MouseEvent>('mouseleave');
 
+  /**
+   * Static factory designed to expose `mousemove` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mousemoveEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseMoveEvent = const EventStreamProvider<MouseEvent>('mousemove');
 
+  /**
+   * Static factory designed to expose `mouseout` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mouseoutEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseOutEvent = const EventStreamProvider<MouseEvent>('mouseout');
 
+  /**
+   * Static factory designed to expose `mouseover` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mouseoverEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseOverEvent = const EventStreamProvider<MouseEvent>('mouseover');
 
+  /**
+   * Static factory designed to expose `mouseup` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mouseupEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseUpEvent = const EventStreamProvider<MouseEvent>('mouseup');
 
+  /**
+   * Static factory designed to expose `mousewheel` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mousewheelEvent')
   @DocsEditable()
   static const EventStreamProvider<WheelEvent> mouseWheelEvent = const EventStreamProvider<WheelEvent>('mousewheel');
 
+  /**
+   * Static factory designed to expose `paste` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.pasteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pasteEvent = const EventStreamProvider<Event>('paste');
 
+  /**
+   * Static factory designed to expose `reset` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.resetEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> resetEvent = const EventStreamProvider<Event>('reset');
 
+  /**
+   * Static factory designed to expose `resize` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.resizeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
 
+  /**
+   * Static factory designed to expose `scroll` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.scrollEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> scrollEvent = const EventStreamProvider<Event>('scroll');
 
+  /**
+   * Static factory designed to expose `search` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.searchEvent')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');
 
+  /**
+   * Static factory designed to expose `select` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.selectEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> selectEvent = const EventStreamProvider<Event>('select');
 
+  /**
+   * Static factory designed to expose `selectstart` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.selectstartEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> selectStartEvent = const EventStreamProvider<Event>('selectstart');
 
+  /**
+   * Static factory designed to expose `submit` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.submitEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> submitEvent = const EventStreamProvider<Event>('submit');
 
+  /**
+   * Static factory designed to expose `unload` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.unloadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
@@ -914,174 +1166,216 @@
   @DocsEditable()
   final ElementInstance previousSibling;
 
+  /// Stream of `abort` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `beforecopy` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onbeforecopy')
   @DocsEditable()
   Stream<Event> get onBeforeCopy => beforeCopyEvent.forTarget(this);
 
+  /// Stream of `beforecut` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onbeforecut')
   @DocsEditable()
   Stream<Event> get onBeforeCut => beforeCutEvent.forTarget(this);
 
+  /// Stream of `beforepaste` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onbeforepaste')
   @DocsEditable()
   Stream<Event> get onBeforePaste => beforePasteEvent.forTarget(this);
 
+  /// Stream of `blur` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onblur')
   @DocsEditable()
   Stream<Event> get onBlur => blurEvent.forTarget(this);
 
+  /// Stream of `change` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onchange')
   @DocsEditable()
   Stream<Event> get onChange => changeEvent.forTarget(this);
 
+  /// Stream of `click` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onclick')
   @DocsEditable()
   Stream<MouseEvent> get onClick => clickEvent.forTarget(this);
 
+  /// Stream of `contextmenu` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.oncontextmenu')
   @DocsEditable()
   Stream<MouseEvent> get onContextMenu => contextMenuEvent.forTarget(this);
 
+  /// Stream of `copy` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.oncopy')
   @DocsEditable()
   Stream<Event> get onCopy => copyEvent.forTarget(this);
 
+  /// Stream of `cut` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.oncut')
   @DocsEditable()
   Stream<Event> get onCut => cutEvent.forTarget(this);
 
+  /// Stream of `doubleclick` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondblclick')
   @DocsEditable()
   Stream<Event> get onDoubleClick => doubleClickEvent.forTarget(this);
 
+  /// Stream of `drag` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondrag')
   @DocsEditable()
   Stream<MouseEvent> get onDrag => dragEvent.forTarget(this);
 
+  /// Stream of `dragend` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondragend')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnd => dragEndEvent.forTarget(this);
 
+  /// Stream of `dragenter` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondragenter')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnter => dragEnterEvent.forTarget(this);
 
+  /// Stream of `dragleave` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondragleave')
   @DocsEditable()
   Stream<MouseEvent> get onDragLeave => dragLeaveEvent.forTarget(this);
 
+  /// Stream of `dragover` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondragover')
   @DocsEditable()
   Stream<MouseEvent> get onDragOver => dragOverEvent.forTarget(this);
 
+  /// Stream of `dragstart` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondragstart')
   @DocsEditable()
   Stream<MouseEvent> get onDragStart => dragStartEvent.forTarget(this);
 
+  /// Stream of `drop` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondrop')
   @DocsEditable()
   Stream<MouseEvent> get onDrop => dropEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `focus` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onfocus')
   @DocsEditable()
   Stream<Event> get onFocus => focusEvent.forTarget(this);
 
+  /// Stream of `input` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.oninput')
   @DocsEditable()
   Stream<Event> get onInput => inputEvent.forTarget(this);
 
+  /// Stream of `keydown` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onkeydown')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyDown => keyDownEvent.forTarget(this);
 
+  /// Stream of `keypress` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onkeypress')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyPress => keyPressEvent.forTarget(this);
 
+  /// Stream of `keyup` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onkeyup')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyUp => keyUpEvent.forTarget(this);
 
+  /// Stream of `load` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onload')
   @DocsEditable()
   Stream<Event> get onLoad => loadEvent.forTarget(this);
 
+  /// Stream of `mousedown` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmousedown')
   @DocsEditable()
   Stream<MouseEvent> get onMouseDown => mouseDownEvent.forTarget(this);
 
+  /// Stream of `mouseenter` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseEnter => mouseEnterEvent.forTarget(this);
 
+  /// Stream of `mouseleave` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseLeave => mouseLeaveEvent.forTarget(this);
 
+  /// Stream of `mousemove` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmousemove')
   @DocsEditable()
   Stream<MouseEvent> get onMouseMove => mouseMoveEvent.forTarget(this);
 
+  /// Stream of `mouseout` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmouseout')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOut => mouseOutEvent.forTarget(this);
 
+  /// Stream of `mouseover` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmouseover')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOver => mouseOverEvent.forTarget(this);
 
+  /// Stream of `mouseup` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmouseup')
   @DocsEditable()
   Stream<MouseEvent> get onMouseUp => mouseUpEvent.forTarget(this);
 
+  /// Stream of `mousewheel` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmousewheel')
   @DocsEditable()
   Stream<WheelEvent> get onMouseWheel => mouseWheelEvent.forTarget(this);
 
+  /// Stream of `paste` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onpaste')
   @DocsEditable()
   Stream<Event> get onPaste => pasteEvent.forTarget(this);
 
+  /// Stream of `reset` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onreset')
   @DocsEditable()
   Stream<Event> get onReset => resetEvent.forTarget(this);
 
+  /// Stream of `resize` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onresize')
   @DocsEditable()
   Stream<Event> get onResize => resizeEvent.forTarget(this);
 
+  /// Stream of `scroll` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onscroll')
   @DocsEditable()
   Stream<Event> get onScroll => scrollEvent.forTarget(this);
 
+  /// Stream of `search` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   Stream<Event> get onSearch => searchEvent.forTarget(this);
 
+  /// Stream of `select` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onselect')
   @DocsEditable()
   Stream<Event> get onSelect => selectEvent.forTarget(this);
 
+  /// Stream of `selectstart` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onselectstart')
   @DocsEditable()
   Stream<Event> get onSelectStart => selectStartEvent.forTarget(this);
 
+  /// Stream of `submit` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onsubmit')
   @DocsEditable()
   Stream<Event> get onSubmit => submitEvent.forTarget(this);
 
+  /// Stream of `unload` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onunload')
   @DocsEditable()
   Stream<Event> get onUnload => unloadEvent.forTarget(this);
diff --git a/sdk/lib/svg/dartium/svg_dartium.dart b/sdk/lib/svg/dartium/svg_dartium.dart
index 7e348f0..b6cb36e 100644
--- a/sdk/lib/svg/dartium/svg_dartium.dart
+++ b/sdk/lib/svg/dartium/svg_dartium.dart
@@ -792,174 +792,426 @@
   // To suppress missing implicit constructor warnings.
   factory ElementInstance._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
 
+  /**
+   * Static factory designed to expose `beforecopy` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.beforecopyEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforeCopyEvent = const EventStreamProvider<Event>('beforecopy');
 
+  /**
+   * Static factory designed to expose `beforecut` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.beforecutEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforeCutEvent = const EventStreamProvider<Event>('beforecut');
 
+  /**
+   * Static factory designed to expose `beforepaste` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.beforepasteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforePasteEvent = const EventStreamProvider<Event>('beforepaste');
 
+  /**
+   * Static factory designed to expose `blur` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.blurEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
 
+  /**
+   * Static factory designed to expose `change` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.changeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
 
+  /**
+   * Static factory designed to expose `click` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.clickEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> clickEvent = const EventStreamProvider<MouseEvent>('click');
 
+  /**
+   * Static factory designed to expose `contextmenu` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.contextmenuEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> contextMenuEvent = const EventStreamProvider<MouseEvent>('contextmenu');
 
+  /**
+   * Static factory designed to expose `copy` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.copyEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> copyEvent = const EventStreamProvider<Event>('copy');
 
+  /**
+   * Static factory designed to expose `cut` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.cutEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> cutEvent = const EventStreamProvider<Event>('cut');
 
+  /**
+   * Static factory designed to expose `doubleclick` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dblclickEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> doubleClickEvent = const EventStreamProvider<Event>('dblclick');
 
+  /**
+   * Static factory designed to expose `drag` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEvent = const EventStreamProvider<MouseEvent>('drag');
 
+  /**
+   * Static factory designed to expose `dragend` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragendEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEndEvent = const EventStreamProvider<MouseEvent>('dragend');
 
+  /**
+   * Static factory designed to expose `dragenter` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragenterEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEnterEvent = const EventStreamProvider<MouseEvent>('dragenter');
 
+  /**
+   * Static factory designed to expose `dragleave` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragleaveEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragLeaveEvent = const EventStreamProvider<MouseEvent>('dragleave');
 
+  /**
+   * Static factory designed to expose `dragover` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragoverEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragOverEvent = const EventStreamProvider<MouseEvent>('dragover');
 
+  /**
+   * Static factory designed to expose `dragstart` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragstartEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragStartEvent = const EventStreamProvider<MouseEvent>('dragstart');
 
+  /**
+   * Static factory designed to expose `drop` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dropEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dropEvent = const EventStreamProvider<MouseEvent>('drop');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `focus` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.focusEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
 
+  /**
+   * Static factory designed to expose `input` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.inputEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> inputEvent = const EventStreamProvider<Event>('input');
 
+  /**
+   * Static factory designed to expose `keydown` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.keydownEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyDownEvent = const EventStreamProvider<KeyboardEvent>('keydown');
 
+  /**
+   * Static factory designed to expose `keypress` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.keypressEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyPressEvent = const EventStreamProvider<KeyboardEvent>('keypress');
 
+  /**
+   * Static factory designed to expose `keyup` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.keyupEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyUpEvent = const EventStreamProvider<KeyboardEvent>('keyup');
 
+  /**
+   * Static factory designed to expose `load` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.loadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
 
+  /**
+   * Static factory designed to expose `mousedown` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mousedownEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseDownEvent = const EventStreamProvider<MouseEvent>('mousedown');
 
+  /**
+   * Static factory designed to expose `mouseenter` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mouseenterEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseEnterEvent = const EventStreamProvider<MouseEvent>('mouseenter');
 
+  /**
+   * Static factory designed to expose `mouseleave` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mouseleaveEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseLeaveEvent = const EventStreamProvider<MouseEvent>('mouseleave');
 
+  /**
+   * Static factory designed to expose `mousemove` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mousemoveEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseMoveEvent = const EventStreamProvider<MouseEvent>('mousemove');
 
+  /**
+   * Static factory designed to expose `mouseout` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mouseoutEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseOutEvent = const EventStreamProvider<MouseEvent>('mouseout');
 
+  /**
+   * Static factory designed to expose `mouseover` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mouseoverEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseOverEvent = const EventStreamProvider<MouseEvent>('mouseover');
 
+  /**
+   * Static factory designed to expose `mouseup` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mouseupEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseUpEvent = const EventStreamProvider<MouseEvent>('mouseup');
 
+  /**
+   * Static factory designed to expose `mousewheel` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mousewheelEvent')
   @DocsEditable()
   static const EventStreamProvider<WheelEvent> mouseWheelEvent = const EventStreamProvider<WheelEvent>('mousewheel');
 
+  /**
+   * Static factory designed to expose `paste` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.pasteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pasteEvent = const EventStreamProvider<Event>('paste');
 
+  /**
+   * Static factory designed to expose `reset` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.resetEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> resetEvent = const EventStreamProvider<Event>('reset');
 
+  /**
+   * Static factory designed to expose `resize` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.resizeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
 
+  /**
+   * Static factory designed to expose `scroll` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.scrollEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> scrollEvent = const EventStreamProvider<Event>('scroll');
 
+  /**
+   * Static factory designed to expose `search` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.searchEvent')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');
 
+  /**
+   * Static factory designed to expose `select` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.selectEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> selectEvent = const EventStreamProvider<Event>('select');
 
+  /**
+   * Static factory designed to expose `selectstart` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.selectstartEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> selectStartEvent = const EventStreamProvider<Event>('selectstart');
 
+  /**
+   * Static factory designed to expose `submit` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.submitEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> submitEvent = const EventStreamProvider<Event>('submit');
 
+  /**
+   * Static factory designed to expose `unload` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.unloadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
@@ -1011,174 +1263,216 @@
   @Experimental() // untriaged
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "SVGElementInstance_removeEventListener_Callback";
 
+  /// Stream of `abort` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `beforecopy` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onbeforecopy')
   @DocsEditable()
   Stream<Event> get onBeforeCopy => beforeCopyEvent.forTarget(this);
 
+  /// Stream of `beforecut` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onbeforecut')
   @DocsEditable()
   Stream<Event> get onBeforeCut => beforeCutEvent.forTarget(this);
 
+  /// Stream of `beforepaste` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onbeforepaste')
   @DocsEditable()
   Stream<Event> get onBeforePaste => beforePasteEvent.forTarget(this);
 
+  /// Stream of `blur` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onblur')
   @DocsEditable()
   Stream<Event> get onBlur => blurEvent.forTarget(this);
 
+  /// Stream of `change` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onchange')
   @DocsEditable()
   Stream<Event> get onChange => changeEvent.forTarget(this);
 
+  /// Stream of `click` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onclick')
   @DocsEditable()
   Stream<MouseEvent> get onClick => clickEvent.forTarget(this);
 
+  /// Stream of `contextmenu` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.oncontextmenu')
   @DocsEditable()
   Stream<MouseEvent> get onContextMenu => contextMenuEvent.forTarget(this);
 
+  /// Stream of `copy` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.oncopy')
   @DocsEditable()
   Stream<Event> get onCopy => copyEvent.forTarget(this);
 
+  /// Stream of `cut` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.oncut')
   @DocsEditable()
   Stream<Event> get onCut => cutEvent.forTarget(this);
 
+  /// Stream of `doubleclick` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondblclick')
   @DocsEditable()
   Stream<Event> get onDoubleClick => doubleClickEvent.forTarget(this);
 
+  /// Stream of `drag` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondrag')
   @DocsEditable()
   Stream<MouseEvent> get onDrag => dragEvent.forTarget(this);
 
+  /// Stream of `dragend` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondragend')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnd => dragEndEvent.forTarget(this);
 
+  /// Stream of `dragenter` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondragenter')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnter => dragEnterEvent.forTarget(this);
 
+  /// Stream of `dragleave` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondragleave')
   @DocsEditable()
   Stream<MouseEvent> get onDragLeave => dragLeaveEvent.forTarget(this);
 
+  /// Stream of `dragover` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondragover')
   @DocsEditable()
   Stream<MouseEvent> get onDragOver => dragOverEvent.forTarget(this);
 
+  /// Stream of `dragstart` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondragstart')
   @DocsEditable()
   Stream<MouseEvent> get onDragStart => dragStartEvent.forTarget(this);
 
+  /// Stream of `drop` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondrop')
   @DocsEditable()
   Stream<MouseEvent> get onDrop => dropEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `focus` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onfocus')
   @DocsEditable()
   Stream<Event> get onFocus => focusEvent.forTarget(this);
 
+  /// Stream of `input` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.oninput')
   @DocsEditable()
   Stream<Event> get onInput => inputEvent.forTarget(this);
 
+  /// Stream of `keydown` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onkeydown')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyDown => keyDownEvent.forTarget(this);
 
+  /// Stream of `keypress` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onkeypress')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyPress => keyPressEvent.forTarget(this);
 
+  /// Stream of `keyup` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onkeyup')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyUp => keyUpEvent.forTarget(this);
 
+  /// Stream of `load` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onload')
   @DocsEditable()
   Stream<Event> get onLoad => loadEvent.forTarget(this);
 
+  /// Stream of `mousedown` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmousedown')
   @DocsEditable()
   Stream<MouseEvent> get onMouseDown => mouseDownEvent.forTarget(this);
 
+  /// Stream of `mouseenter` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseEnter => mouseEnterEvent.forTarget(this);
 
+  /// Stream of `mouseleave` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseLeave => mouseLeaveEvent.forTarget(this);
 
+  /// Stream of `mousemove` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmousemove')
   @DocsEditable()
   Stream<MouseEvent> get onMouseMove => mouseMoveEvent.forTarget(this);
 
+  /// Stream of `mouseout` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmouseout')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOut => mouseOutEvent.forTarget(this);
 
+  /// Stream of `mouseover` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmouseover')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOver => mouseOverEvent.forTarget(this);
 
+  /// Stream of `mouseup` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmouseup')
   @DocsEditable()
   Stream<MouseEvent> get onMouseUp => mouseUpEvent.forTarget(this);
 
+  /// Stream of `mousewheel` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmousewheel')
   @DocsEditable()
   Stream<WheelEvent> get onMouseWheel => mouseWheelEvent.forTarget(this);
 
+  /// Stream of `paste` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onpaste')
   @DocsEditable()
   Stream<Event> get onPaste => pasteEvent.forTarget(this);
 
+  /// Stream of `reset` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onreset')
   @DocsEditable()
   Stream<Event> get onReset => resetEvent.forTarget(this);
 
+  /// Stream of `resize` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onresize')
   @DocsEditable()
   Stream<Event> get onResize => resizeEvent.forTarget(this);
 
+  /// Stream of `scroll` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onscroll')
   @DocsEditable()
   Stream<Event> get onScroll => scrollEvent.forTarget(this);
 
+  /// Stream of `search` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   Stream<Event> get onSearch => searchEvent.forTarget(this);
 
+  /// Stream of `select` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onselect')
   @DocsEditable()
   Stream<Event> get onSelect => selectEvent.forTarget(this);
 
+  /// Stream of `selectstart` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onselectstart')
   @DocsEditable()
   Stream<Event> get onSelectStart => selectStartEvent.forTarget(this);
 
+  /// Stream of `submit` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onsubmit')
   @DocsEditable()
   Stream<Event> get onSubmit => submitEvent.forTarget(this);
 
+  /// Stream of `unload` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onunload')
   @DocsEditable()
   Stream<Event> get onUnload => unloadEvent.forTarget(this);
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index 2caaa64..4556a90 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -154,6 +154,12 @@
   // To suppress missing implicit constructor warnings.
   factory AudioBufferSourceNode._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `ended` events to event
+   * handlers that are not necessarily instances of [AudioBufferSourceNode].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('AudioBufferSourceNode.endedEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -215,6 +221,7 @@
   @DocsEditable()
   void noteOn(num when) native;
 
+  /// Stream of `ended` events handled by this [AudioBufferSourceNode].
   @DomName('AudioBufferSourceNode.onended')
   @DocsEditable()
   @Experimental() // untriaged
@@ -233,6 +240,12 @@
   // To suppress missing implicit constructor warnings.
   factory AudioContext._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `complete` events to event
+   * handlers that are not necessarily instances of [AudioContext].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('AudioContext.completeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> completeEvent = const EventStreamProvider<Event>('complete');
@@ -362,6 +375,7 @@
   @DocsEditable()
   void startRendering() native;
 
+  /// Stream of `complete` events handled by this [AudioContext].
   @DomName('AudioContext.oncomplete')
   @DocsEditable()
   Stream<Event> get onComplete => completeEvent.forTarget(this);
@@ -884,6 +898,12 @@
   // To suppress missing implicit constructor warnings.
   factory OscillatorNode._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `ended` events to event
+   * handlers that are not necessarily instances of [OscillatorNode].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('OscillatorNode.endedEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -942,6 +962,7 @@
   @DocsEditable()
   void stop(num when) native;
 
+  /// Stream of `ended` events handled by this [OscillatorNode].
   @DomName('OscillatorNode.onended')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1029,6 +1050,12 @@
   // To suppress missing implicit constructor warnings.
   factory ScriptProcessorNode._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `audioprocess` events to event
+   * handlers that are not necessarily instances of [ScriptProcessorNode].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ScriptProcessorNode.audioprocessEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1038,7 +1065,8 @@
   @DocsEditable()
   final int bufferSize;
 
-  /**
+  /// Stream of `audioprocess` events handled by this [ScriptProcessorNode].
+/**
    * Get a Stream that fires events when AudioProcessingEvents occur.
    * This particular stream is special in that it only allows one listener to a
    * given stream. Converting the returned Stream [asBroadcast] will likely ruin
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
index e5cc155..5157bc3 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -147,6 +147,12 @@
   // To suppress missing implicit constructor warnings.
   factory AudioBufferSourceNode._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `ended` events to event
+   * handlers that are not necessarily instances of [AudioBufferSourceNode].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('AudioBufferSourceNode.endedEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -250,6 +256,7 @@
   @DocsEditable()
   void stop(num when) native "AudioBufferSourceNode_stop_Callback";
 
+  /// Stream of `ended` events handled by this [AudioBufferSourceNode].
   @DomName('AudioBufferSourceNode.onended')
   @DocsEditable()
   @Experimental() // untriaged
@@ -268,6 +275,12 @@
   // To suppress missing implicit constructor warnings.
   factory AudioContext._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `complete` events to event
+   * handlers that are not necessarily instances of [AudioContext].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('AudioContext.completeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> completeEvent = const EventStreamProvider<Event>('complete');
@@ -474,6 +487,7 @@
   @Experimental() // untriaged
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "AudioContext_removeEventListener_Callback";
 
+  /// Stream of `complete` events handled by this [AudioContext].
   @DomName('AudioContext.oncomplete')
   @DocsEditable()
   Stream<Event> get onComplete => completeEvent.forTarget(this);
@@ -1084,6 +1098,12 @@
   // To suppress missing implicit constructor warnings.
   factory OscillatorNode._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `ended` events to event
+   * handlers that are not necessarily instances of [OscillatorNode].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('OscillatorNode.endedEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1146,6 +1166,7 @@
   @DocsEditable()
   void stop(num when) native "OscillatorNode_stop_Callback";
 
+  /// Stream of `ended` events handled by this [OscillatorNode].
   @DomName('OscillatorNode.onended')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1274,6 +1295,12 @@
   // To suppress missing implicit constructor warnings.
   factory ScriptProcessorNode._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `audioprocess` events to event
+   * handlers that are not necessarily instances of [ScriptProcessorNode].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ScriptProcessorNode.audioprocessEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1288,7 +1315,8 @@
   @Experimental() // non-standard
   void _setEventListener(EventListener eventListener) native "ScriptProcessorNode__setEventListener_Callback";
 
-  /**
+  /// Stream of `audioprocess` events handled by this [ScriptProcessorNode].
+/**
    * Get a Stream that fires events when AudioProcessingEvents occur.
    * This particular stream is special in that it only allows one listener to a
    * given stream. Converting the returned Stream [asBroadcast] will likely ruin
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index da0374b..99b4ee0 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -3,6 +3,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dart2analyzer ]
+
 # invalid argument for constant constructor
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t02: fail
 
@@ -15,6 +16,22 @@
 # TBF: malformed or malbounded type in "conts" is static warning
 Language/12_Expressions/12_Instance_Creation_A01_t08: Fail
 
+# TBF: it seems that "12.15.3 Unqualied Invocation" was changed, so it may be not an error anymore to call unknown function from top-level
+Language/13_Statements/04_Local_Function_Declaration_A04_t02: Fail # co19-roll r641: Please triage this failure
+
+# TBF: when we override "foo([x = 0]) {}" with "foo([x]) {}" we should report warning - different default value
+Language/07_Classes/1_Instance_Methods_A04_t02: MissingStaticWarning
+Language/07_Classes/4_Abstract_Instance_Members_A07_t04: MissingStaticWarning
+
+# TBF: It is a static warning if a class C declares an instance method named n and has a setter named n=.
+Language/07_Classes/1_Instance_Methods_A07_t01: MissingStaticWarning
+Language/07_Classes/1_Instance_Methods_A07_t02: MissingStaticWarning
+
+# TBF: Static members should not be accessible via subclasses.
+Language/07_Classes/7_Static_Methods_A01_t03: MissingStaticWarning
+Language/07_Classes/9_Superclasses/1_Inheritance_and_Overriding_A01_t05: MissingStaticWarning
+Language/08_Interfaces/5_Superinterfaces/1_Inheritance_and_Overriding_A01_t02: MissingStaticWarning
+
 
 
 # co19 issue #442, undefined name "Expect"
@@ -71,13 +88,6 @@
 # co19 issue #623: main() { {}; } is block and empty statement, not a map
 Language/13_Statements/02_Expression_Statements_A01_t13: Fail, OK
 
-# co19 issue #650: two argument shuffles have been refactored.
-LibTest/typed_data/Float32x4/interleaveZWPairs_A01_t01: Fail # co19 issue 650
-LibTest/typed_data/Float32x4/interleaveZW_A01_t01: Fail # co19 issue 650
-LibTest/typed_data/Float32x4/withZWInXY_A01_t01: Fail # co19 issue 650
-LibTest/typed_data/Float32x4/interleaveXY_A01_t01: Fail # co19 issue 650
-LibTest/typed_data/Float32x4/interleaveXYPairs_A01_t01: Fail # co19 issue 650
-
 # co19 issue #626: StreamTransformers have been refactored.
 LibTest/async/EventTransformStream/EventTransformStream_A01_t01: Fail
 LibTest/async/EventTransformStream/EventTransformStream_A01_t02: Fail
@@ -234,28 +244,23 @@
 
 Language/13_Statements/09_Switch_A02_t04: Fail  # Issue 629
 
-Language/12_Expressions/05_Strings_A20_t01: Fail # co19-roll r623: Please triage this failure
-LibTest/collection/DoubleLinkedQueue/DoubleLinkedQueue_class_A01_t01: Fail # co19-roll r623: Please triage this failure
-LibTest/collection/ListQueue/ListQueue_class_A01_t01: Fail # co19-roll r623: Please triage this failure
-LibTest/collection/Queue/Queue_class_A01_t01: Fail # co19-roll r623: Please triage this failure
 
-Language/13_Statements/04_Local_Function_Declaration_A04_t02: Fail # co19-roll r641: Please triage this failure
 
-Language/06_Functions/06_Functions_A04_t01: MissingStaticWarning
-Language/07_Classes/1_Instance_Methods_A04_t02: MissingStaticWarning
-Language/07_Classes/1_Instance_Methods_A07_t01: MissingStaticWarning
-Language/07_Classes/1_Instance_Methods_A07_t02: MissingStaticWarning
-Language/07_Classes/4_Abstract_Instance_Members_A07_t04: MissingStaticWarning
-Language/07_Classes/7_Static_Methods_A01_t03: MissingStaticWarning
-Language/07_Classes/9_Superclasses/1_Inheritance_and_Overriding_A01_t05: MissingStaticWarning
-Language/08_Interfaces/5_Superinterfaces/1_Inheritance_and_Overriding_A01_t02: MissingStaticWarning
+
+# co19 issue 642, The argument type 'int' cannot be assigned to the parameter type 'Iterable'
+LibTest/collection/DoubleLinkedQueue/DoubleLinkedQueue_class_A01_t01: Fail, OK
+LibTest/collection/ListQueue/ListQueue_class_A01_t01: Fail, OK
+LibTest/collection/Queue/Queue_class_A01_t01: Fail, OK
+
+# co19 issue 644, The argument type 'int' cannot be assigned to the parameter type '(String, Object) -> void'
+LibTest/collection/LinkedHashMap/allTests_A01_t01: Fail, OK
+
+# co19 issue 645, "15.7 Type Void". Likewise, passing the result of a void method as a parameter or assigning it to a variable will cause a warning unless the variable/formal parameter has type dynamic.
+Language/06_Functions/06_Functions_A04_t01: Fail, OK
+
+# co19 issue 646, I don't see where Spec requires any warning for boolean conversion
 Language/12_Expressions/04_Booleans/1_Boolean_Conversion_A01_t02: MissingStaticWarning
-Language/12_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A05_t02: MissingStaticWarning
-Language/12_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A06_t02: MissingStaticWarning
-Language/12_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A06_t06: MissingStaticWarning
-Language/12_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A07_t02: MissingStaticWarning
-Language/12_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A08_t02: MissingStaticWarning
-Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A04_t02: MissingStaticWarning
+
 Language/12_Expressions/15_Method_Invocation/2_Cascaded_Invocation_A01_t19: MissingStaticWarning
 Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t02: MissingStaticWarning
 Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t09: MissingStaticWarning
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 4a6e5a3..726f14e 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -29,10 +29,6 @@
 #
 
 
-# test issue 10683, It is a compile-time error if e refers to the name v or the name v=.
-block_scope_test: fail
-lazy_static3_test: fail
-
 # test issue 11124, It is warning, not error to don't initialize final field
 field3a_negative_test: Fail # Issue 11124
 final_syntax_test/01: Fail # Issue 11124
@@ -161,18 +157,9 @@
 bailout3_test: fail # test issue 14289
 prefix9_test: fail # test issue 14289
 
-# test issue 14358, E does not implement inherited A.+
-type_promotion_closure_test/01: Fail
-type_promotion_closure_test/02: Fail
-
 # test issue 14363, "if ((a is B))" has the same effect as "if (a is B)", so no static warning expected
 type_promotion_parameter_test/53: Fail
 
-# test issue 14364, "E<A> << D"
-type_promotion_more_specific_test/09: Fail
-type_promotion_more_specific_test/10: Fail
-type_promotion_more_specific_test/11: Fail
-
 # test issue 14410, "typedef C = " is now really illegal syntax
 mixin_illegal_syntax_test/none: fail
 
@@ -184,7 +171,6 @@
 application_negative_test: CompileTimeError
 bad_constructor_test/05: CompileTimeError
 bad_initializer1_negative_test: CompileTimeError
-bad_initializer2_negative_test: CompileTimeError
 bad_named_constructor_negative_test: CompileTimeError
 bad_named_parameters2_test: StaticWarning
 bad_named_parameters_test: StaticWarning
@@ -454,8 +440,6 @@
 try_catch5_test: StaticWarning
 type_argument_in_super_type_test: StaticWarning
 typed_selector2_test: StaticWarning
-type_variable_bounds2_test/05: StaticWarning
-type_variable_bounds3_test/00: StaticWarning
 type_variable_identifier_expression_test: StaticWarning
 type_variable_scope2_test: StaticWarning
 unary_plus_negative_test: CompileTimeError
diff --git a/tests/lib/analyzer/analyze_library.status b/tests/lib/analyzer/analyze_library.status
index 22712a8..84c66b4 100644
--- a/tests/lib/analyzer/analyze_library.status
+++ b/tests/lib/analyzer/analyze_library.status
@@ -2,10 +2,13 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
+[ $compiler == dart2analyzer ]
+lib: Skip # Slow like a hell - timeouts.
+
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
-lib/core/bool: CompileTimeError
-lib/core/int: CompileTimeError
-lib/core/string: CompileTimeError
+lib/core/bool: CompileTimeError, OK # Issue 14684. Only redirecting factory constructors can be declared to be 'const'
+lib/core/int: CompileTimeError, OK # Issue 14684. Only redirecting factory constructors can be declared to be 'const'
+lib/core/string: CompileTimeError, OK # Issue 14684. Only redirecting factory constructors can be declared to be 'const'
 lib/_chrome/dart2js/chrome_dart2js: CompileTimeError
 lib/html/dart2js/html_dart2js: CompileTimeError
 lib/html/dartium/html_dartium: CompileTimeError
diff --git a/tools/VERSION b/tools/VERSION
index b4cf83b..8ce1702 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
 MAJOR 0
 MINOR 8
 BUILD 10
-PATCH 0
+PATCH 1
diff --git a/tools/dom/docs/docs.json b/tools/dom/docs/docs.json
index 82c6737..00cf4d1 100644
--- a/tools/dom/docs/docs.json
+++ b/tools/dom/docs/docs.json
@@ -1,5 +1,112 @@
 {
   "dart.dom.html": {
+    "AbstractWorker": {
+      "members": {
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [AbstractWorker].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [AbstractWorker]."
+        ]
+      }
+    },
+    "ApplicationCache": {
+      "members": {
+        "cachedEvent": [
+          "/**",
+          "   * Static factory designed to expose `cached` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "checkingEvent": [
+          "/**",
+          "   * Static factory designed to expose `checking` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "downloadingEvent": [
+          "/**",
+          "   * Static factory designed to expose `downloading` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "noupdateEvent": [
+          "/**",
+          "   * Static factory designed to expose `noupdate` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "obsoleteEvent": [
+          "/**",
+          "   * Static factory designed to expose `obsolete` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "oncached": [
+          "/// Stream of `cached` events handled by this [ApplicationCache]."
+        ],
+        "onchecking": [
+          "/// Stream of `checking` events handled by this [ApplicationCache]."
+        ],
+        "ondownloading": [
+          "/// Stream of `downloading` events handled by this [ApplicationCache]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [ApplicationCache]."
+        ],
+        "onnoupdate": [
+          "/// Stream of `noupdate` events handled by this [ApplicationCache]."
+        ],
+        "onobsolete": [
+          "/// Stream of `obsolete` events handled by this [ApplicationCache]."
+        ],
+        "onprogress": [
+          "/// Stream of `progress` events handled by this [ApplicationCache]."
+        ],
+        "onupdateready": [
+          "/// Stream of `updateready` events handled by this [ApplicationCache]."
+        ],
+        "progressEvent": [
+          "/**",
+          "   * Static factory designed to expose `progress` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "updatereadyEvent": [
+          "/**",
+          "   * Static factory designed to expose `updateready` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
     "CanvasGradient": {
       "comment": [
         "/**",
@@ -114,6 +221,21 @@
         ]
       }
     },
+    "DedicatedWorkerGlobalScope": {
+      "members": {
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [DedicatedWorkerGlobalScope].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [DedicatedWorkerGlobalScope]."
+        ]
+      }
+    },
     "Document": {
       "comment": [
         "/**",
@@ -127,6 +249,162 @@
         " */"
       ],
       "members": {
+        "onabort": [
+          "/// Stream of `abort` events handled by this [Document]."
+        ],
+        "onbeforecopy": [
+          "/// Stream of `beforecopy` events handled by this [Document]."
+        ],
+        "onbeforecut": [
+          "/// Stream of `beforecut` events handled by this [Document]."
+        ],
+        "onbeforepaste": [
+          "/// Stream of `beforepaste` events handled by this [Document]."
+        ],
+        "onblur": [
+          "/// Stream of `blur` events handled by this [Document]."
+        ],
+        "onchange": [
+          "/// Stream of `change` events handled by this [Document]."
+        ],
+        "onclick": [
+          "/// Stream of `click` events handled by this [Document]."
+        ],
+        "oncontextmenu": [
+          "/// Stream of `contextmenu` events handled by this [Document]."
+        ],
+        "oncopy": [
+          "/// Stream of `copy` events handled by this [Document]."
+        ],
+        "oncut": [
+          "/// Stream of `cut` events handled by this [Document]."
+        ],
+        "ondblclick": [
+          "/// Stream of `doubleclick` events handled by this [Document]."
+        ],
+        "ondrag": [
+          "/// Stream of `drag` events handled by this [Document]."
+        ],
+        "ondragend": [
+          "/// Stream of `dragend` events handled by this [Document]."
+        ],
+        "ondragenter": [
+          "/// Stream of `dragenter` events handled by this [Document]."
+        ],
+        "ondragleave": [
+          "/// Stream of `dragleave` events handled by this [Document]."
+        ],
+        "ondragover": [
+          "/// Stream of `dragover` events handled by this [Document]."
+        ],
+        "ondragstart": [
+          "/// Stream of `dragstart` events handled by this [Document]."
+        ],
+        "ondrop": [
+          "/// Stream of `drop` events handled by this [Document]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Document]."
+        ],
+        "onfocus": [
+          "/// Stream of `focus` events handled by this [Document]."
+        ],
+        "oninput": [
+          "/// Stream of `input` events handled by this [Document]."
+        ],
+        "oninvalid": [
+          "/// Stream of `invalid` events handled by this [Document]."
+        ],
+        "onkeydown": [
+          "/// Stream of `keydown` events handled by this [Document]."
+        ],
+        "onkeypress": [
+          "/// Stream of `keypress` events handled by this [Document]."
+        ],
+        "onkeyup": [
+          "/// Stream of `keyup` events handled by this [Document]."
+        ],
+        "onload": [
+          "/// Stream of `load` events handled by this [Document]."
+        ],
+        "onmousedown": [
+          "/// Stream of `mousedown` events handled by this [Document]."
+        ],
+        "onmouseenter": [
+          "/// Stream of `mouseenter` events handled by this [Document]."
+        ],
+        "onmouseleave": [
+          "/// Stream of `mouseleave` events handled by this [Document]."
+        ],
+        "onmousemove": [
+          "/// Stream of `mousemove` events handled by this [Document]."
+        ],
+        "onmouseout": [
+          "/// Stream of `mouseout` events handled by this [Document]."
+        ],
+        "onmouseover": [
+          "/// Stream of `mouseover` events handled by this [Document]."
+        ],
+        "onmouseup": [
+          "/// Stream of `mouseup` events handled by this [Document]."
+        ],
+        "onmousewheel": [
+          "/// Stream of `mousewheel` events handled by this [Document]."
+        ],
+        "onpaste": [
+          "/// Stream of `paste` events handled by this [Document]."
+        ],
+        "onreadystatechange": [
+          "/// Stream of `readystatechange` events handled by this [Document]."
+        ],
+        "onreset": [
+          "/// Stream of `reset` events handled by this [Document]."
+        ],
+        "onscroll": [
+          "/// Stream of `scroll` events handled by this [Document]."
+        ],
+        "onsearch": [
+          "/// Stream of `search` events handled by this [Document]."
+        ],
+        "onsecuritypolicyviolation": [
+          "/// Stream of `securitypolicyviolation` events handled by this [Document]."
+        ],
+        "onselect": [
+          "/// Stream of `select` events handled by this [Document]."
+        ],
+        "onselectionchange": [
+          "/// Stream of `selectionchange` events handled by this [Document]."
+        ],
+        "onselectstart": [
+          "/// Stream of `selectstart` events handled by this [Document]."
+        ],
+        "onsubmit": [
+          "/// Stream of `submit` events handled by this [Document]."
+        ],
+        "ontouchcancel": [
+          "/// Stream of `touchcancel` events handled by this [Document]."
+        ],
+        "ontouchend": [
+          "/// Stream of `touchend` events handled by this [Document]."
+        ],
+        "ontouchmove": [
+          "/// Stream of `touchmove` events handled by this [Document]."
+        ],
+        "ontouchstart": [
+          "/// Stream of `touchstart` events handled by this [Document]."
+        ],
+        "onwebkitfullscreenchange": [
+          "/// Stream of `fullscreenchange` events handled by this [Document]."
+        ],
+        "onwebkitfullscreenerror": [
+          "/// Stream of `fullscreenerror` events handled by this [Document]."
+        ],
+        "onwebkitpointerlockchange": [
+          "/// Stream of `pointerlockchange` events handled by this [Document]."
+        ],
+        "onwebkitpointerlockerror": [
+          "/// Stream of `pointerlockerror` events handled by this [Document]."
+        ],
         "querySelector": [
           "/**",
           "   * Finds the first descendant element of this document that matches the",
@@ -144,6 +422,46 @@
           "   * For details about CSS selector syntax, see the",
           "   * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).",
           "   */"
+        ],
+        "readystatechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `readystatechange` events to event",
+          "   * handlers that are not necessarily instances of [Document].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "securitypolicyviolationEvent": [
+          "/**",
+          "   * Static factory designed to expose `securitypolicyviolation` events to event",
+          "   * handlers that are not necessarily instances of [Document].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "selectionchangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `selectionchange` events to event",
+          "   * handlers that are not necessarily instances of [Document].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitpointerlockchangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `pointerlockchange` events to event",
+          "   * handlers that are not necessarily instances of [Document].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitpointerlockerrorEvent": [
+          "/**",
+          "   * Static factory designed to expose `pointerlockerror` events to event",
+          "   * handlers that are not necessarily instances of [Document].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
         ]
       }
     },
@@ -154,6 +472,658 @@
         " */"
       ],
       "members": {
+        "abortEvent": [
+          "/**",
+          "   * Static factory designed to expose `abort` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "beforecopyEvent": [
+          "/**",
+          "   * Static factory designed to expose `beforecopy` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "beforecutEvent": [
+          "/**",
+          "   * Static factory designed to expose `beforecut` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "beforepasteEvent": [
+          "/**",
+          "   * Static factory designed to expose `beforepaste` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "blurEvent": [
+          "/**",
+          "   * Static factory designed to expose `blur` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "changeEvent": [
+          "/**",
+          "   * Static factory designed to expose `change` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "clickEvent": [
+          "/**",
+          "   * Static factory designed to expose `click` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "contextmenuEvent": [
+          "/**",
+          "   * Static factory designed to expose `contextmenu` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "copyEvent": [
+          "/**",
+          "   * Static factory designed to expose `copy` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "cutEvent": [
+          "/**",
+          "   * Static factory designed to expose `cut` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dblclickEvent": [
+          "/**",
+          "   * Static factory designed to expose `doubleclick` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dragendEvent": [
+          "/**",
+          "   * A stream of `dragend` events fired when an element completes a drag",
+          "   * operation.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "dragenterEvent": [
+          "/**",
+          "   * A stream of `dragenter` events fired when a dragged object is first dragged",
+          "   * over an element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "dragEvent": [
+          "/**",
+          "   * A stream of `drag` events fired when an element is currently being dragged.",
+          "   *",
+          "   * A `drag` event is added to this stream as soon as the drag begins.",
+          "   * A `drag` event is also added to this stream at intervals while the drag",
+          "   * operation is still ongoing.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "draggable": [
+          "/**",
+          "   * Indicates whether the element can be dragged and dropped.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "dragleaveEvent": [
+          "/**",
+          "   * A stream of `dragleave` events fired when an object being dragged over an",
+          "   * element leaves the element's target area.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "dragoverEvent": [
+          "/**",
+          "   * A stream of `dragover` events fired when a dragged object is currently",
+          "   * being dragged over an element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "dragstartEvent": [
+          "/**",
+          "   * A stream of `dragstart` events for a dragged element whose drag has begun.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "dropEvent": [
+          "/**",
+          "   * A stream of `drop` events fired when a dragged object is dropped on an",
+          "   * element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "focusEvent": [
+          "/**",
+          "   * Static factory designed to expose `focus` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "getBoundingClientRect": [
+          "/**",
+          "   * The smallest bounding rectangle that encompasses this element's padding,",
+          "   * scrollbar, and border.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Element.getBoundingClientRect]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect)",
+          "   * from MDN.",
+          "   * * [The getBoundingClientRect() method]",
+          "   * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods) from W3C.",
+          "   */"
+        ],
+        "getClientRects": [
+          "/**",
+          "   * A list of bounding rectangles for each box associated with this element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Element.getClientRects]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Element.getClientRects)",
+          "   * from MDN.",
+          "   * * [The getClientRects() method]",
+          "   * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods) from W3C.",
+          "   */"
+        ],
+        "hidden": [
+          "/**",
+          "   * Indicates whether the element is not relevant to the page's current state.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Hidden attribute specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#the-hidden-attribute)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "inputEvent": [
+          "/**",
+          "   * Static factory designed to expose `input` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "inputMethodContext": [
+          "/**",
+          "   * The current state of IME composition.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Input method editor specification]",
+          "   * (http://www.w3.org/TR/ime-api/) from W3C.",
+          "   */"
+        ],
+        "invalidEvent": [
+          "/**",
+          "   * Static factory designed to expose `invalid` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "keydownEvent": [
+          "/**",
+          "   * Static factory designed to expose `keydown` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "keypressEvent": [
+          "/**",
+          "   * Static factory designed to expose `keypress` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "keyupEvent": [
+          "/**",
+          "   * Static factory designed to expose `keyup` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadEvent": [
+          "/**",
+          "   * Static factory designed to expose `load` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mousedownEvent": [
+          "/**",
+          "   * Static factory designed to expose `mousedown` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseenterEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseenter` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseleaveEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseleave` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mousemoveEvent": [
+          "/**",
+          "   * Static factory designed to expose `mousemove` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseoutEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseout` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseoverEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseover` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseupEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseup` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [Element]."
+        ],
+        "onbeforecopy": [
+          "/// Stream of `beforecopy` events handled by this [Element]."
+        ],
+        "onbeforecut": [
+          "/// Stream of `beforecut` events handled by this [Element]."
+        ],
+        "onbeforepaste": [
+          "/// Stream of `beforepaste` events handled by this [Element]."
+        ],
+        "onblur": [
+          "/// Stream of `blur` events handled by this [Element]."
+        ],
+        "onchange": [
+          "/// Stream of `change` events handled by this [Element]."
+        ],
+        "onclick": [
+          "/// Stream of `click` events handled by this [Element]."
+        ],
+        "oncontextmenu": [
+          "/// Stream of `contextmenu` events handled by this [Element]."
+        ],
+        "oncopy": [
+          "/// Stream of `copy` events handled by this [Element]."
+        ],
+        "oncut": [
+          "/// Stream of `cut` events handled by this [Element]."
+        ],
+        "ondblclick": [
+          "/// Stream of `doubleclick` events handled by this [Element]."
+        ],
+        "ondrag": [
+          "/**",
+          "   * A stream of `drag` events fired when this element currently being dragged.",
+          "   *",
+          "   * A `drag` event is added to this stream as soon as the drag begins.",
+          "   * A `drag` event is also added to this stream at intervals while the drag",
+          "   * operation is still ongoing.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "ondragend": [
+          "/**",
+          "   * A stream of `dragend` events fired when this element completes a drag",
+          "   * operation.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "ondragenter": [
+          "/**",
+          "   * A stream of `dragenter` events fired when a dragged object is first dragged",
+          "   * over this element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "ondragleave": [
+          "/**",
+          "   * A stream of `dragleave` events fired when an object being dragged over this",
+          "   * element leaves this element's target area.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "ondragover": [
+          "/**",
+          "   * A stream of `dragover` events fired when a dragged object is currently",
+          "   * being dragged over this element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "ondragstart": [
+          "/**",
+          "   * A stream of `dragstart` events fired when this element starts being",
+          "   * dragged.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "ondrop": [
+          "/**",
+          "   * A stream of `drop` events fired when a dragged object is dropped on this",
+          "   * element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Element]."
+        ],
+        "onfocus": [
+          "/// Stream of `focus` events handled by this [Element]."
+        ],
+        "oninput": [
+          "/// Stream of `input` events handled by this [Element]."
+        ],
+        "oninvalid": [
+          "/// Stream of `invalid` events handled by this [Element]."
+        ],
+        "onkeydown": [
+          "/// Stream of `keydown` events handled by this [Element]."
+        ],
+        "onkeypress": [
+          "/// Stream of `keypress` events handled by this [Element]."
+        ],
+        "onkeyup": [
+          "/// Stream of `keyup` events handled by this [Element]."
+        ],
+        "onload": [
+          "/// Stream of `load` events handled by this [Element]."
+        ],
+        "onmousedown": [
+          "/// Stream of `mousedown` events handled by this [Element]."
+        ],
+        "onmouseenter": [
+          "/// Stream of `mouseenter` events handled by this [Element]."
+        ],
+        "onmouseleave": [
+          "/// Stream of `mouseleave` events handled by this [Element]."
+        ],
+        "onmousemove": [
+          "/// Stream of `mousemove` events handled by this [Element]."
+        ],
+        "onmouseout": [
+          "/// Stream of `mouseout` events handled by this [Element]."
+        ],
+        "onmouseover": [
+          "/// Stream of `mouseover` events handled by this [Element]."
+        ],
+        "onmouseup": [
+          "/// Stream of `mouseup` events handled by this [Element]."
+        ],
+        "onmousewheel": [
+          "/// Stream of `mousewheel` events handled by this [Element]."
+        ],
+        "onpaste": [
+          "/// Stream of `paste` events handled by this [Element]."
+        ],
+        "onreset": [
+          "/// Stream of `reset` events handled by this [Element]."
+        ],
+        "onscroll": [
+          "/// Stream of `scroll` events handled by this [Element]."
+        ],
+        "onsearch": [
+          "/// Stream of `search` events handled by this [Element]."
+        ],
+        "onselect": [
+          "/// Stream of `select` events handled by this [Element]."
+        ],
+        "onselectstart": [
+          "/// Stream of `selectstart` events handled by this [Element]."
+        ],
+        "onsubmit": [
+          "/// Stream of `submit` events handled by this [Element]."
+        ],
+        "ontouchcancel": [
+          "/// Stream of `touchcancel` events handled by this [Element]."
+        ],
+        "ontouchend": [
+          "/// Stream of `touchend` events handled by this [Element]."
+        ],
+        "ontouchenter": [
+          "/// Stream of `touchenter` events handled by this [Element]."
+        ],
+        "ontouchleave": [
+          "/// Stream of `touchleave` events handled by this [Element]."
+        ],
+        "ontouchmove": [
+          "/// Stream of `touchmove` events handled by this [Element]."
+        ],
+        "ontouchstart": [
+          "/// Stream of `touchstart` events handled by this [Element]."
+        ],
+        "ontransitionend": [
+          "/// Stream of `transitionend` events handled by this [Element]."
+        ],
+        "onwebkitfullscreenchange": [
+          "/// Stream of `fullscreenchange` events handled by this [Element]."
+        ],
+        "onwebkitfullscreenerror": [
+          "/// Stream of `fullscreenerror` events handled by this [Element]."
+        ],
+        "pasteEvent": [
+          "/**",
+          "   * Static factory designed to expose `paste` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "pseudo": [
+          "/**",
+          "   * The name of this element's custom pseudo-element.",
+          "   *",
+          "   * This value must begin with an x and a hyphen, `x-`, to be considered valid.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Using custom pseudo elements]",
+          "   * (http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom-201/#toc-custom-pseduo)",
+          "   * from HTML5Rocks.",
+          "   * * [Custom pseudo-elements]",
+          "   * (http://www.w3.org/TR/shadow-dom/#custom-pseudo-elements) from W3C.",
+          "   */"
+        ],
         "querySelector": [
           "/**",
           "   * Finds the first descendant element of this element that matches the",
@@ -172,6 +1142,341 @@
           "   *",
           "   * * [CSS Selectors](http://docs.webplatform.org/wiki/css/selectors)",
           "   */"
+        ],
+        "resetEvent": [
+          "/**",
+          "   * Static factory designed to expose `reset` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "scrollEvent": [
+          "/**",
+          "   * Static factory designed to expose `scroll` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "searchEvent": [
+          "/**",
+          "   * Static factory designed to expose `search` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "selectEvent": [
+          "/**",
+          "   * Static factory designed to expose `select` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "selectstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `selectstart` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "submitEvent": [
+          "/**",
+          "   * Static factory designed to expose `submit` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "touchcancelEvent": [
+          "/**",
+          "   * Static factory designed to expose `touchcancel` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "touchendEvent": [
+          "/**",
+          "   * Static factory designed to expose `touchend` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "touchenterEvent": [
+          "/**",
+          "   * Static factory designed to expose `touchenter` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "touchleaveEvent": [
+          "/**",
+          "   * Static factory designed to expose `touchleave` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "touchmoveEvent": [
+          "/**",
+          "   * Static factory designed to expose `touchmove` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "touchstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `touchstart` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "translate": [
+          "/**",
+          "   * Specifies whether this element's text content changes when the page is",
+          "   * localized.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The translate attribute]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#the-translate-attribute)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "webkitdropzone": [
+          "/**",
+          "   * A set of space-separated keywords that specify what kind of data this",
+          "   * Element accepts on drop and what to do with that data.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "webkitfullscreenchangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `fullscreenchange` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitfullscreenerrorEvent": [
+          "/**",
+          "   * Static factory designed to expose `fullscreenerror` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitRegionOverset": [
+          "/**",
+          "   * The current state of this region.",
+          "   *",
+          "   * If `\"empty\"`, then there is no content in this region.",
+          "   * If `\"fit\"`, then content fits into this region, and more content can be",
+          "   * added. If `\"overset\"`, then there is more content than can be fit into this",
+          "   * region.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [CSS regions and exclusions tutorial]",
+          "   * (http://www.html5rocks.com/en/tutorials/regions/adobe/) from HTML5Rocks.",
+          "   * * [Regions](http://html.adobe.com/webplatform/layout/regions/) from Adobe.",
+          "   * * [CSS regions specification]",
+          "   * (http://www.w3.org/TR/css3-regions/) from W3C.",
+          "   */"
+        ]
+      }
+    },
+    "EventSource": {
+      "members": {
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [EventSource].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [EventSource].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [EventSource]."
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [EventSource]."
+        ],
+        "onopen": [
+          "/// Stream of `open` events handled by this [EventSource]."
+        ],
+        "openEvent": [
+          "/**",
+          "   * Static factory designed to expose `open` events to event",
+          "   * handlers that are not necessarily instances of [EventSource].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "FileReader": {
+      "members": {
+        "abortEvent": [
+          "/**",
+          "   * Static factory designed to expose `abort` events to event",
+          "   * handlers that are not necessarily instances of [FileReader].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [FileReader].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadendEvent": [
+          "/**",
+          "   * Static factory designed to expose `loadend` events to event",
+          "   * handlers that are not necessarily instances of [FileReader].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadEvent": [
+          "/**",
+          "   * Static factory designed to expose `load` events to event",
+          "   * handlers that are not necessarily instances of [FileReader].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `loadstart` events to event",
+          "   * handlers that are not necessarily instances of [FileReader].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [FileReader]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [FileReader]."
+        ],
+        "onload": [
+          "/// Stream of `load` events handled by this [FileReader]."
+        ],
+        "onloadend": [
+          "/// Stream of `loadend` events handled by this [FileReader]."
+        ],
+        "onloadstart": [
+          "/// Stream of `loadstart` events handled by this [FileReader]."
+        ],
+        "onprogress": [
+          "/// Stream of `progress` events handled by this [FileReader]."
+        ],
+        "progressEvent": [
+          "/**",
+          "   * Static factory designed to expose `progress` events to event",
+          "   * handlers that are not necessarily instances of [FileReader].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "FileWriter": {
+      "members": {
+        "abortEvent": [
+          "/**",
+          "   * Static factory designed to expose `abort` events to event",
+          "   * handlers that are not necessarily instances of [FileWriter].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [FileWriter].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [FileWriter]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [FileWriter]."
+        ],
+        "onprogress": [
+          "/// Stream of `progress` events handled by this [FileWriter]."
+        ],
+        "onwrite": [
+          "/// Stream of `write` events handled by this [FileWriter]."
+        ],
+        "onwriteend": [
+          "/// Stream of `writeend` events handled by this [FileWriter]."
+        ],
+        "onwritestart": [
+          "/// Stream of `writestart` events handled by this [FileWriter]."
+        ],
+        "progressEvent": [
+          "/**",
+          "   * Static factory designed to expose `progress` events to event",
+          "   * handlers that are not necessarily instances of [FileWriter].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "writeendEvent": [
+          "/**",
+          "   * Static factory designed to expose `writeend` events to event",
+          "   * handlers that are not necessarily instances of [FileWriter].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "writeEvent": [
+          "/**",
+          "   * Static factory designed to expose `write` events to event",
+          "   * handlers that are not necessarily instances of [FileWriter].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "writestartEvent": [
+          "/**",
+          "   * Static factory designed to expose `writestart` events to event",
+          "   * handlers that are not necessarily instances of [FileWriter].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
         ]
       }
     },
@@ -189,11 +1494,169 @@
         " */"
       ]
     },
+    "HTMLBodyElement": {
+      "members": {
+        "blurEvent": [
+          "/**",
+          "   * Static factory designed to expose `blur` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "focusEvent": [
+          "/**",
+          "   * Static factory designed to expose `focus` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "hashchangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `hashchange` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadEvent": [
+          "/**",
+          "   * Static factory designed to expose `load` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "offlineEvent": [
+          "/**",
+          "   * Static factory designed to expose `offline` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onblur": [
+          "/// Stream of `blur` events handled by this [BodyElement]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [BodyElement]."
+        ],
+        "onfocus": [
+          "/// Stream of `focus` events handled by this [BodyElement]."
+        ],
+        "onhashchange": [
+          "/// Stream of `hashchange` events handled by this [BodyElement]."
+        ],
+        "onlineEvent": [
+          "/**",
+          "   * Static factory designed to expose `online` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onload": [
+          "/// Stream of `load` events handled by this [BodyElement]."
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [BodyElement]."
+        ],
+        "onoffline": [
+          "/// Stream of `offline` events handled by this [BodyElement]."
+        ],
+        "ononline": [
+          "/// Stream of `online` events handled by this [BodyElement]."
+        ],
+        "onpopstate": [
+          "/// Stream of `popstate` events handled by this [BodyElement]."
+        ],
+        "onresize": [
+          "/// Stream of `resize` events handled by this [BodyElement]."
+        ],
+        "onstorage": [
+          "/// Stream of `storage` events handled by this [BodyElement]."
+        ],
+        "onunload": [
+          "/// Stream of `unload` events handled by this [BodyElement]."
+        ],
+        "popstateEvent": [
+          "/**",
+          "   * Static factory designed to expose `popstate` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "resizeEvent": [
+          "/**",
+          "   * Static factory designed to expose `resize` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "storageEvent": [
+          "/**",
+          "   * Static factory designed to expose `storage` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "unloadEvent": [
+          "/**",
+          "   * Static factory designed to expose `unload` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
     "HTMLCanvasElement": {
       "members": {
         "height": [
           "/// The height of this canvas element in CSS pixels."
         ],
+        "onwebglcontextlost": [
+          "/// Stream of `webglcontextlost` events handled by this [CanvasElement]."
+        ],
+        "onwebglcontextrestored": [
+          "/// Stream of `webglcontextrestored` events handled by this [CanvasElement]."
+        ],
+        "webglcontextlostEvent": [
+          "/**",
+          "   * Static factory designed to expose `webglcontextlost` events to event",
+          "   * handlers that are not necessarily instances of [CanvasElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webglcontextrestoredEvent": [
+          "/**",
+          "   * Static factory designed to expose `webglcontextrestored` events to event",
+          "   * handlers that are not necessarily instances of [CanvasElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
         "width": [
           "/// The width of this canvas element in CSS pixels."
         ]
@@ -225,6 +1688,32 @@
         " */"
       ]
     },
+    "HTMLFormElement": {
+      "members": {
+        "autocompleteerrorEvent": [
+          "/**",
+          "   * Static factory designed to expose `autocompleteerror` events to event",
+          "   * handlers that are not necessarily instances of [FormElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "autocompleteEvent": [
+          "/**",
+          "   * Static factory designed to expose `autocomplete` events to event",
+          "   * handlers that are not necessarily instances of [FormElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onautocomplete": [
+          "/// Stream of `autocomplete` events handled by this [FormElement]."
+        ],
+        "onautocompleteerror": [
+          "/// Stream of `autocompleteerror` events handled by this [FormElement]."
+        ]
+      }
+    },
     "HTMLHRElement": {
       "comment": [
         "/**",
@@ -232,6 +1721,300 @@
         " */"
       ]
     },
+    "HTMLInputElement": {
+      "members": {
+        "onwebkitSpeechChange": [
+          "/// Stream of `speechchange` events handled by this [InputElement]."
+        ],
+        "webkitSpeechChangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `speechchange` events to event",
+          "   * handlers that are not necessarily instances of [InputElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "HTMLMediaElement": {
+      "members": {
+        "canplayEvent": [
+          "/**",
+          "   * Static factory designed to expose `canplay` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "canplaythroughEvent": [
+          "/**",
+          "   * Static factory designed to expose `canplaythrough` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "durationchangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `durationchange` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "emptiedEvent": [
+          "/**",
+          "   * Static factory designed to expose `emptied` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "endedEvent": [
+          "/**",
+          "   * Static factory designed to expose `ended` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadeddataEvent": [
+          "/**",
+          "   * Static factory designed to expose `loadeddata` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadedmetadataEvent": [
+          "/**",
+          "   * Static factory designed to expose `loadedmetadata` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `loadstart` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "oncanplay": [
+          "/// Stream of `canplay` events handled by this [MediaElement]."
+        ],
+        "oncanplaythrough": [
+          "/// Stream of `canplaythrough` events handled by this [MediaElement]."
+        ],
+        "ondurationchange": [
+          "/// Stream of `durationchange` events handled by this [MediaElement]."
+        ],
+        "onemptied": [
+          "/// Stream of `emptied` events handled by this [MediaElement]."
+        ],
+        "onended": [
+          "/// Stream of `ended` events handled by this [MediaElement]."
+        ],
+        "onloadeddata": [
+          "/// Stream of `loadeddata` events handled by this [MediaElement]."
+        ],
+        "onloadedmetadata": [
+          "/// Stream of `loadedmetadata` events handled by this [MediaElement]."
+        ],
+        "onloadstart": [
+          "/// Stream of `loadstart` events handled by this [MediaElement]."
+        ],
+        "onpause": [
+          "/// Stream of `pause` events handled by this [MediaElement]."
+        ],
+        "onplay": [
+          "/// Stream of `play` events handled by this [MediaElement]."
+        ],
+        "onplaying": [
+          "/// Stream of `playing` events handled by this [MediaElement]."
+        ],
+        "onprogress": [
+          "/// Stream of `progress` events handled by this [MediaElement]."
+        ],
+        "onratechange": [
+          "/// Stream of `ratechange` events handled by this [MediaElement]."
+        ],
+        "onseeked": [
+          "/// Stream of `seeked` events handled by this [MediaElement]."
+        ],
+        "onseeking": [
+          "/// Stream of `seeking` events handled by this [MediaElement]."
+        ],
+        "onshow": [
+          "/// Stream of `show` events handled by this [MediaElement]."
+        ],
+        "onstalled": [
+          "/// Stream of `stalled` events handled by this [MediaElement]."
+        ],
+        "onsuspend": [
+          "/// Stream of `suspend` events handled by this [MediaElement]."
+        ],
+        "ontimeupdate": [
+          "/// Stream of `timeupdate` events handled by this [MediaElement]."
+        ],
+        "onvolumechange": [
+          "/// Stream of `volumechange` events handled by this [MediaElement]."
+        ],
+        "onwaiting": [
+          "/// Stream of `waiting` events handled by this [MediaElement]."
+        ],
+        "onwebkitkeyadded": [
+          "/// Stream of `keyadded` events handled by this [MediaElement]."
+        ],
+        "onwebkitkeyerror": [
+          "/// Stream of `keyerror` events handled by this [MediaElement]."
+        ],
+        "onwebkitkeymessage": [
+          "/// Stream of `keymessage` events handled by this [MediaElement]."
+        ],
+        "onwebkitneedkey": [
+          "/// Stream of `needkey` events handled by this [MediaElement]."
+        ],
+        "pauseEvent": [
+          "/**",
+          "   * Static factory designed to expose `pause` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "playEvent": [
+          "/**",
+          "   * Static factory designed to expose `play` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "playingEvent": [
+          "/**",
+          "   * Static factory designed to expose `playing` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "progressEvent": [
+          "/**",
+          "   * Static factory designed to expose `progress` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "ratechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `ratechange` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "seekedEvent": [
+          "/**",
+          "   * Static factory designed to expose `seeked` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "seekingEvent": [
+          "/**",
+          "   * Static factory designed to expose `seeking` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "showEvent": [
+          "/**",
+          "   * Static factory designed to expose `show` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "stalledEvent": [
+          "/**",
+          "   * Static factory designed to expose `stalled` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "suspendEvent": [
+          "/**",
+          "   * Static factory designed to expose `suspend` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "timeupdateEvent": [
+          "/**",
+          "   * Static factory designed to expose `timeupdate` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "volumechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `volumechange` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "waitingEvent": [
+          "/**",
+          "   * Static factory designed to expose `waiting` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitkeyaddedEvent": [
+          "/**",
+          "   * Static factory designed to expose `keyadded` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitkeyerrorEvent": [
+          "/**",
+          "   * Static factory designed to expose `keyerror` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitkeymessageEvent": [
+          "/**",
+          "   * Static factory designed to expose `keymessage` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitneedkeyEvent": [
+          "/**",
+          "   * Static factory designed to expose `needkey` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
     "HTMLMenuElement": {
       "comment": [
         "/**",
@@ -246,6 +2029,188 @@
         " */"
       ]
     },
+    "MediaKeySession": {
+      "members": {
+        "onwebkitkeyadded": [
+          "/// Stream of `keyadded` events handled by this [MediaKeySession]."
+        ],
+        "onwebkitkeyerror": [
+          "/// Stream of `keyerror` events handled by this [MediaKeySession]."
+        ],
+        "onwebkitkeymessage": [
+          "/// Stream of `keymessage` events handled by this [MediaKeySession]."
+        ],
+        "webkitkeyaddedEvent": [
+          "/**",
+          "   * Static factory designed to expose `keyadded` events to event",
+          "   * handlers that are not necessarily instances of [MediaKeySession].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitkeyerrorEvent": [
+          "/**",
+          "   * Static factory designed to expose `keyerror` events to event",
+          "   * handlers that are not necessarily instances of [MediaKeySession].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitkeymessageEvent": [
+          "/**",
+          "   * Static factory designed to expose `keymessage` events to event",
+          "   * handlers that are not necessarily instances of [MediaKeySession].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "MediaStream": {
+      "members": {
+        "addtrackEvent": [
+          "/**",
+          "   * Static factory designed to expose `addtrack` events to event",
+          "   * handlers that are not necessarily instances of [MediaStream].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "endedEvent": [
+          "/**",
+          "   * Static factory designed to expose `ended` events to event",
+          "   * handlers that are not necessarily instances of [MediaStream].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onaddtrack": [
+          "/// Stream of `addtrack` events handled by this [MediaStream]."
+        ],
+        "onended": [
+          "/// Stream of `ended` events handled by this [MediaStream]."
+        ],
+        "onremovetrack": [
+          "/// Stream of `removetrack` events handled by this [MediaStream]."
+        ],
+        "removetrackEvent": [
+          "/**",
+          "   * Static factory designed to expose `removetrack` events to event",
+          "   * handlers that are not necessarily instances of [MediaStream].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "MediaStreamTrack": {
+      "members": {
+        "endedEvent": [
+          "/**",
+          "   * Static factory designed to expose `ended` events to event",
+          "   * handlers that are not necessarily instances of [MediaStreamTrack].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "muteEvent": [
+          "/**",
+          "   * Static factory designed to expose `mute` events to event",
+          "   * handlers that are not necessarily instances of [MediaStreamTrack].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onended": [
+          "/// Stream of `ended` events handled by this [MediaStreamTrack]."
+        ],
+        "onmute": [
+          "/// Stream of `mute` events handled by this [MediaStreamTrack]."
+        ],
+        "onunmute": [
+          "/// Stream of `unmute` events handled by this [MediaStreamTrack]."
+        ],
+        "unmuteEvent": [
+          "/**",
+          "   * Static factory designed to expose `unmute` events to event",
+          "   * handlers that are not necessarily instances of [MediaStreamTrack].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "MessagePort": {
+      "members": {
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [MessagePort].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [MessagePort]."
+        ]
+      }
+    },
+    "MIDIAccess": {
+      "members": {
+        "connectEvent": [
+          "/**",
+          "   * Static factory designed to expose `connect` events to event",
+          "   * handlers that are not necessarily instances of [MidiAccess].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "disconnectEvent": [
+          "/**",
+          "   * Static factory designed to expose `disconnect` events to event",
+          "   * handlers that are not necessarily instances of [MidiAccess].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onconnect": [
+          "/// Stream of `connect` events handled by this [MidiAccess]."
+        ],
+        "ondisconnect": [
+          "/// Stream of `disconnect` events handled by this [MidiAccess]."
+        ]
+      }
+    },
+    "MIDIInput": {
+      "members": {
+        "midimessageEvent": [
+          "/**",
+          "   * Static factory designed to expose `midimessage` events to event",
+          "   * handlers that are not necessarily instances of [MidiInput].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onmidimessage": [
+          "/// Stream of `midimessage` events handled by this [MidiInput]."
+        ]
+      }
+    },
+    "MIDIPort": {
+      "members": {
+        "disconnectEvent": [
+          "/**",
+          "   * Static factory designed to expose `disconnect` events to event",
+          "   * handlers that are not necessarily instances of [MidiPort].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "ondisconnect": [
+          "/// Stream of `disconnect` events handled by this [MidiPort]."
+        ]
+      }
+    },
     "Node": {
       "members": {
         "appendChild": [
@@ -261,6 +2226,501 @@
         ]
       }
     },
+    "Notification": {
+      "members": {
+        "clickEvent": [
+          "/**",
+          "   * Static factory designed to expose `click` events to event",
+          "   * handlers that are not necessarily instances of [Notification].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "closeEvent": [
+          "/**",
+          "   * Static factory designed to expose `close` events to event",
+          "   * handlers that are not necessarily instances of [Notification].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "displayEvent": [
+          "/**",
+          "   * Static factory designed to expose `display` events to event",
+          "   * handlers that are not necessarily instances of [Notification].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [Notification].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onclick": [
+          "/// Stream of `click` events handled by this [Notification]."
+        ],
+        "onclose": [
+          "/// Stream of `close` events handled by this [Notification]."
+        ],
+        "ondisplay": [
+          "/// Stream of `display` events handled by this [Notification]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Notification]."
+        ],
+        "onshow": [
+          "/// Stream of `show` events handled by this [Notification]."
+        ],
+        "showEvent": [
+          "/**",
+          "   * Static factory designed to expose `show` events to event",
+          "   * handlers that are not necessarily instances of [Notification].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "Performance": {
+      "members": {
+        "onwebkitresourcetimingbufferfull": [
+          "/// Stream of `resourcetimingbufferfull` events handled by this [Performance]."
+        ],
+        "webkitresourcetimingbufferfullEvent": [
+          "/**",
+          "   * Static factory designed to expose `resourcetimingbufferfull` events to event",
+          "   * handlers that are not necessarily instances of [Performance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "RTCDataChannel": {
+      "members": {
+        "closeEvent": [
+          "/**",
+          "   * Static factory designed to expose `close` events to event",
+          "   * handlers that are not necessarily instances of [RtcDataChannel].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [RtcDataChannel].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [RtcDataChannel].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onclose": [
+          "/// Stream of `close` events handled by this [RtcDataChannel]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [RtcDataChannel]."
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [RtcDataChannel]."
+        ],
+        "onopen": [
+          "/// Stream of `open` events handled by this [RtcDataChannel]."
+        ],
+        "openEvent": [
+          "/**",
+          "   * Static factory designed to expose `open` events to event",
+          "   * handlers that are not necessarily instances of [RtcDataChannel].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "RTCDTMFSender": {
+      "members": {
+        "ontonechange": [
+          "/// Stream of `tonechange` events handled by this [RtcDtmfSender]."
+        ],
+        "tonechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `tonechange` events to event",
+          "   * handlers that are not necessarily instances of [RtcDtmfSender].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "RTCPeerConnection": {
+      "members": {
+        "addstreamEvent": [
+          "/**",
+          "   * Static factory designed to expose `addstream` events to event",
+          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "datachannelEvent": [
+          "/**",
+          "   * Static factory designed to expose `datachannel` events to event",
+          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "icecandidateEvent": [
+          "/**",
+          "   * Static factory designed to expose `icecandidate` events to event",
+          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "iceconnectionstatechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `iceconnectionstatechange` events to event",
+          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "negotiationneededEvent": [
+          "/**",
+          "   * Static factory designed to expose `negotiationneeded` events to event",
+          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onaddstream": [
+          "/// Stream of `addstream` events handled by this [RtcPeerConnection]."
+        ],
+        "ondatachannel": [
+          "/// Stream of `datachannel` events handled by this [RtcPeerConnection]."
+        ],
+        "onicecandidate": [
+          "/// Stream of `icecandidate` events handled by this [RtcPeerConnection]."
+        ],
+        "oniceconnectionstatechange": [
+          "/// Stream of `iceconnectionstatechange` events handled by this [RtcPeerConnection]."
+        ],
+        "onnegotiationneeded": [
+          "/// Stream of `negotiationneeded` events handled by this [RtcPeerConnection]."
+        ],
+        "onremovestream": [
+          "/// Stream of `removestream` events handled by this [RtcPeerConnection]."
+        ],
+        "onsignalingstatechange": [
+          "/// Stream of `signalingstatechange` events handled by this [RtcPeerConnection]."
+        ],
+        "removestreamEvent": [
+          "/**",
+          "   * Static factory designed to expose `removestream` events to event",
+          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "signalingstatechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `signalingstatechange` events to event",
+          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "SharedWorkerGlobalScope": {
+      "members": {
+        "connectEvent": [
+          "/**",
+          "   * Static factory designed to expose `connect` events to event",
+          "   * handlers that are not necessarily instances of [SharedWorkerGlobalScope].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onconnect": [
+          "/// Stream of `connect` events handled by this [SharedWorkerGlobalScope]."
+        ]
+      }
+    },
+    "SpeechRecognition": {
+      "members": {
+        "audioendEvent": [
+          "/**",
+          "   * Static factory designed to expose `audioend` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "audiostartEvent": [
+          "/**",
+          "   * Static factory designed to expose `audiostart` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "endEvent": [
+          "/**",
+          "   * Static factory designed to expose `end` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "nomatchEvent": [
+          "/**",
+          "   * Static factory designed to expose `nomatch` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onaudioend": [
+          "/// Stream of `audioend` events handled by this [SpeechRecognition]."
+        ],
+        "onaudiostart": [
+          "/// Stream of `audiostart` events handled by this [SpeechRecognition]."
+        ],
+        "onend": [
+          "/// Stream of `end` events handled by this [SpeechRecognition]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [SpeechRecognition]."
+        ],
+        "onnomatch": [
+          "/// Stream of `nomatch` events handled by this [SpeechRecognition]."
+        ],
+        "onresult": [
+          "/// Stream of `result` events handled by this [SpeechRecognition]."
+        ],
+        "onsoundend": [
+          "/// Stream of `soundend` events handled by this [SpeechRecognition]."
+        ],
+        "onsoundstart": [
+          "/// Stream of `soundstart` events handled by this [SpeechRecognition]."
+        ],
+        "onspeechend": [
+          "/// Stream of `speechend` events handled by this [SpeechRecognition]."
+        ],
+        "onspeechstart": [
+          "/// Stream of `speechstart` events handled by this [SpeechRecognition]."
+        ],
+        "onstart": [
+          "/// Stream of `start` events handled by this [SpeechRecognition]."
+        ],
+        "resultEvent": [
+          "/**",
+          "   * Static factory designed to expose `result` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "soundendEvent": [
+          "/**",
+          "   * Static factory designed to expose `soundend` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "soundstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `soundstart` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "speechendEvent": [
+          "/**",
+          "   * Static factory designed to expose `speechend` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "speechstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `speechstart` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "startEvent": [
+          "/**",
+          "   * Static factory designed to expose `start` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "SpeechSynthesisUtterance": {
+      "members": {
+        "boundaryEvent": [
+          "/**",
+          "   * Static factory designed to expose `boundary` events to event",
+          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "endEvent": [
+          "/**",
+          "   * Static factory designed to expose `end` events to event",
+          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "markEvent": [
+          "/**",
+          "   * Static factory designed to expose `mark` events to event",
+          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onboundary": [
+          "/// Stream of `boundary` events handled by this [SpeechSynthesisUtterance]."
+        ],
+        "onend": [
+          "/// Stream of `end` events handled by this [SpeechSynthesisUtterance]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [SpeechSynthesisUtterance]."
+        ],
+        "onmark": [
+          "/// Stream of `mark` events handled by this [SpeechSynthesisUtterance]."
+        ],
+        "onpause": [
+          "/// Stream of `pause` events handled by this [SpeechSynthesisUtterance]."
+        ],
+        "onresume": [
+          "/// Stream of `resume` events handled by this [SpeechSynthesisUtterance]."
+        ],
+        "onstart": [
+          "/// Stream of `start` events handled by this [SpeechSynthesisUtterance]."
+        ],
+        "pauseEvent": [
+          "/**",
+          "   * Static factory designed to expose `pause` events to event",
+          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "resumeEvent": [
+          "/**",
+          "   * Static factory designed to expose `resume` events to event",
+          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "startEvent": [
+          "/**",
+          "   * Static factory designed to expose `start` events to event",
+          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "TextTrack": {
+      "members": {
+        "cuechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `cuechange` events to event",
+          "   * handlers that are not necessarily instances of [TextTrack].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "oncuechange": [
+          "/// Stream of `cuechange` events handled by this [TextTrack]."
+        ]
+      }
+    },
+    "TextTrackCue": {
+      "members": {
+        "enterEvent": [
+          "/**",
+          "   * Static factory designed to expose `enter` events to event",
+          "   * handlers that are not necessarily instances of [TextTrackCue].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "exitEvent": [
+          "/**",
+          "   * Static factory designed to expose `exit` events to event",
+          "   * handlers that are not necessarily instances of [TextTrackCue].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onenter": [
+          "/// Stream of `enter` events handled by this [TextTrackCue]."
+        ],
+        "onexit": [
+          "/// Stream of `exit` events handled by this [TextTrackCue]."
+        ]
+      }
+    },
+    "TextTrackList": {
+      "members": {
+        "addtrackEvent": [
+          "/**",
+          "   * Static factory designed to expose `addtrack` events to event",
+          "   * handlers that are not necessarily instances of [TextTrackList].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onaddtrack": [
+          "/// Stream of `addtrack` events handled by this [TextTrackList]."
+        ]
+      }
+    },
     "WebSocket": {
       "comment": [
         "/**",
@@ -299,6 +2759,50 @@
         " */"
       ],
       "members": {
+        "closeEvent": [
+          "/**",
+          "   * Static factory designed to expose `close` events to event",
+          "   * handlers that are not necessarily instances of [WebSocket].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [WebSocket].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [WebSocket].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onclose": [
+          "/// Stream of `close` events handled by this [WebSocket]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [WebSocket]."
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [WebSocket]."
+        ],
+        "onopen": [
+          "/// Stream of `open` events handled by this [WebSocket]."
+        ],
+        "openEvent": [
+          "/**",
+          "   * Static factory designed to expose `open` events to event",
+          "   * handlers that are not necessarily instances of [WebSocket].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
         "send": [
           "/**",
           "   * Transmit data to the server over this connection.",
@@ -339,7 +2843,343 @@
         " * * [DOM Window](https://developer.mozilla.org/en-US/docs/DOM/window) from MDN.",
         " * * [Window](http://www.w3.org/TR/Window/) from the W3C.",
         " */"
-      ]
+      ],
+      "members": {
+        "devicemotionEvent": [
+          "/**",
+          "   * Static factory designed to expose `devicemotion` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "deviceorientationEvent": [
+          "/**",
+          "   * Static factory designed to expose `deviceorientation` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "DOMContentLoadedEvent": [
+          "/**",
+          "   * Static factory designed to expose `contentloaded` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "hashchangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `hashchange` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "offlineEvent": [
+          "/**",
+          "   * Static factory designed to expose `offline` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [Window]."
+        ],
+        "onblur": [
+          "/// Stream of `blur` events handled by this [Window]."
+        ],
+        "onchange": [
+          "/// Stream of `change` events handled by this [Window]."
+        ],
+        "onclick": [
+          "/// Stream of `click` events handled by this [Window]."
+        ],
+        "oncontextmenu": [
+          "/// Stream of `contextmenu` events handled by this [Window]."
+        ],
+        "ondblclick": [
+          "/// Stream of `doubleclick` events handled by this [Window]."
+        ],
+        "ondevicemotion": [
+          "/// Stream of `devicemotion` events handled by this [Window]."
+        ],
+        "ondeviceorientation": [
+          "/// Stream of `deviceorientation` events handled by this [Window]."
+        ],
+        "onDOMContentLoaded": [
+          "/// Stream of `contentloaded` events handled by this [Window]."
+        ],
+        "ondrag": [
+          "/// Stream of `drag` events handled by this [Window]."
+        ],
+        "ondragend": [
+          "/// Stream of `dragend` events handled by this [Window]."
+        ],
+        "ondragenter": [
+          "/// Stream of `dragenter` events handled by this [Window]."
+        ],
+        "ondragleave": [
+          "/// Stream of `dragleave` events handled by this [Window]."
+        ],
+        "ondragover": [
+          "/// Stream of `dragover` events handled by this [Window]."
+        ],
+        "ondragstart": [
+          "/// Stream of `dragstart` events handled by this [Window]."
+        ],
+        "ondrop": [
+          "/// Stream of `drop` events handled by this [Window]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Window]."
+        ],
+        "onfocus": [
+          "/// Stream of `focus` events handled by this [Window]."
+        ],
+        "onhashchange": [
+          "/// Stream of `hashchange` events handled by this [Window]."
+        ],
+        "oninput": [
+          "/// Stream of `input` events handled by this [Window]."
+        ],
+        "oninvalid": [
+          "/// Stream of `invalid` events handled by this [Window]."
+        ],
+        "onkeydown": [
+          "/// Stream of `keydown` events handled by this [Window]."
+        ],
+        "onkeypress": [
+          "/// Stream of `keypress` events handled by this [Window]."
+        ],
+        "onkeyup": [
+          "/// Stream of `keyup` events handled by this [Window]."
+        ],
+        "onlineEvent": [
+          "/**",
+          "   * Static factory designed to expose `online` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onload": [
+          "/// Stream of `load` events handled by this [Window]."
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [Window]."
+        ],
+        "onmousedown": [
+          "/// Stream of `mousedown` events handled by this [Window]."
+        ],
+        "onmouseenter": [
+          "/// Stream of `mouseenter` events handled by this [Window]."
+        ],
+        "onmouseleave": [
+          "/// Stream of `mouseleave` events handled by this [Window]."
+        ],
+        "onmousemove": [
+          "/// Stream of `mousemove` events handled by this [Window]."
+        ],
+        "onmouseout": [
+          "/// Stream of `mouseout` events handled by this [Window]."
+        ],
+        "onmouseover": [
+          "/// Stream of `mouseover` events handled by this [Window]."
+        ],
+        "onmouseup": [
+          "/// Stream of `mouseup` events handled by this [Window]."
+        ],
+        "onmousewheel": [
+          "/// Stream of `mousewheel` events handled by this [Window]."
+        ],
+        "onoffline": [
+          "/// Stream of `offline` events handled by this [Window]."
+        ],
+        "ononline": [
+          "/// Stream of `online` events handled by this [Window]."
+        ],
+        "onpagehide": [
+          "/// Stream of `pagehide` events handled by this [Window]."
+        ],
+        "onpageshow": [
+          "/// Stream of `pageshow` events handled by this [Window]."
+        ],
+        "onpopstate": [
+          "/// Stream of `popstate` events handled by this [Window]."
+        ],
+        "onreset": [
+          "/// Stream of `reset` events handled by this [Window]."
+        ],
+        "onresize": [
+          "/// Stream of `resize` events handled by this [Window]."
+        ],
+        "onscroll": [
+          "/// Stream of `scroll` events handled by this [Window]."
+        ],
+        "onsearch": [
+          "/// Stream of `search` events handled by this [Window]."
+        ],
+        "onselect": [
+          "/// Stream of `select` events handled by this [Window]."
+        ],
+        "onstorage": [
+          "/// Stream of `storage` events handled by this [Window]."
+        ],
+        "onsubmit": [
+          "/// Stream of `submit` events handled by this [Window]."
+        ],
+        "ontouchcancel": [
+          "/// Stream of `touchcancel` events handled by this [Window]."
+        ],
+        "ontouchend": [
+          "/// Stream of `touchend` events handled by this [Window]."
+        ],
+        "ontouchmove": [
+          "/// Stream of `touchmove` events handled by this [Window]."
+        ],
+        "ontouchstart": [
+          "/// Stream of `touchstart` events handled by this [Window]."
+        ],
+        "ontransitionend": [
+          "/// Stream of `transitionend` events handled by this [Window]."
+        ],
+        "onunload": [
+          "/// Stream of `unload` events handled by this [Window]."
+        ],
+        "onwebkitAnimationEnd": [
+          "/// Stream of `animationend` events handled by this [Window]."
+        ],
+        "onwebkitAnimationIteration": [
+          "/// Stream of `animationiteration` events handled by this [Window]."
+        ],
+        "onwebkitAnimationStart": [
+          "/// Stream of `animationstart` events handled by this [Window]."
+        ],
+        "pagehideEvent": [
+          "/**",
+          "   * Static factory designed to expose `pagehide` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "pageshowEvent": [
+          "/**",
+          "   * Static factory designed to expose `pageshow` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "popstateEvent": [
+          "/**",
+          "   * Static factory designed to expose `popstate` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "resizeEvent": [
+          "/**",
+          "   * Static factory designed to expose `resize` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "storageEvent": [
+          "/**",
+          "   * Static factory designed to expose `storage` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "unloadEvent": [
+          "/**",
+          "   * Static factory designed to expose `unload` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitAnimationEndEvent": [
+          "/**",
+          "   * Static factory designed to expose `animationend` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitAnimationIterationEvent": [
+          "/**",
+          "   * Static factory designed to expose `animationiteration` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitAnimationStartEvent": [
+          "/**",
+          "   * Static factory designed to expose `animationstart` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "Worker": {
+      "members": {
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [Worker].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [Worker].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Worker]."
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [Worker]."
+        ]
+      }
+    },
+    "WorkerGlobalScope": {
+      "members": {
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [WorkerGlobalScope].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [WorkerGlobalScope]."
+        ]
+      }
     },
     "XMLHttpRequest": {
       "members": {
@@ -373,6 +3213,7 @@
           "   */"
         ],
         "onreadystatechange": [
+          "/// Stream of `readystatechange` events handled by this [HttpRequest].",
           "/**",
           "   * Event listeners to be notified every time the [HttpRequest]",
           "   * object's `readyState` changes values.",
@@ -438,6 +3279,14 @@
           "   * </table>",
           "   */"
         ],
+        "readystatechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `readystatechange` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequest].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
         "response": [
           "/**",
           "   * The data received as a reponse from the request.",
@@ -533,6 +3382,87 @@
           "   */"
         ]
       }
+    },
+    "XMLHttpRequestEventTarget": {
+      "members": {
+        "abortEvent": [
+          "/**",
+          "   * Static factory designed to expose `abort` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadendEvent": [
+          "/**",
+          "   * Static factory designed to expose `loadend` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadEvent": [
+          "/**",
+          "   * Static factory designed to expose `load` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `loadstart` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [HttpRequestEventTarget]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [HttpRequestEventTarget]."
+        ],
+        "onload": [
+          "/// Stream of `load` events handled by this [HttpRequestEventTarget]."
+        ],
+        "onloadend": [
+          "/// Stream of `loadend` events handled by this [HttpRequestEventTarget]."
+        ],
+        "onloadstart": [
+          "/// Stream of `loadstart` events handled by this [HttpRequestEventTarget]."
+        ],
+        "onprogress": [
+          "/// Stream of `progress` events handled by this [HttpRequestEventTarget]."
+        ],
+        "ontimeout": [
+          "/// Stream of `timeout` events handled by this [HttpRequestEventTarget]."
+        ],
+        "progressEvent": [
+          "/**",
+          "   * Static factory designed to expose `progress` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "timeoutEvent": [
+          "/**",
+          "   * Static factory designed to expose `timeout` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
     }
   },
   "dart.dom.indexed_db": {
@@ -542,13 +3472,670 @@
         " * An indexed database object for storing client-side data",
         " * in web apps.",
         " */"
-      ]
+      ],
+      "members": {
+        "abortEvent": [
+          "/**",
+          "   * Static factory designed to expose `abort` events to event",
+          "   * handlers that are not necessarily instances of [Database].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "closeEvent": [
+          "/**",
+          "   * Static factory designed to expose `close` events to event",
+          "   * handlers that are not necessarily instances of [Database].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [Database].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [Database]."
+        ],
+        "onclose": [
+          "/// Stream of `close` events handled by this [Database]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Database]."
+        ],
+        "onversionchange": [
+          "/// Stream of `versionchange` events handled by this [Database]."
+        ],
+        "versionchangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `versionchange` events to event",
+          "   * handlers that are not necessarily instances of [Database].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "IDBOpenDBRequest": {
+      "members": {
+        "blockedEvent": [
+          "/**",
+          "   * Static factory designed to expose `blocked` events to event",
+          "   * handlers that are not necessarily instances of [OpenDBRequest].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onblocked": [
+          "/// Stream of `blocked` events handled by this [OpenDBRequest]."
+        ],
+        "onupgradeneeded": [
+          "/// Stream of `upgradeneeded` events handled by this [OpenDBRequest]."
+        ],
+        "upgradeneededEvent": [
+          "/**",
+          "   * Static factory designed to expose `upgradeneeded` events to event",
+          "   * handlers that are not necessarily instances of [OpenDBRequest].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "IDBRequest": {
+      "members": {
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [Request].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Request]."
+        ],
+        "onsuccess": [
+          "/// Stream of `success` events handled by this [Request]."
+        ],
+        "successEvent": [
+          "/**",
+          "   * Static factory designed to expose `success` events to event",
+          "   * handlers that are not necessarily instances of [Request].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "IDBTransaction": {
+      "members": {
+        "abortEvent": [
+          "/**",
+          "   * Static factory designed to expose `abort` events to event",
+          "   * handlers that are not necessarily instances of [Transaction].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "completeEvent": [
+          "/**",
+          "   * Static factory designed to expose `complete` events to event",
+          "   * handlers that are not necessarily instances of [Transaction].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [Transaction].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [Transaction]."
+        ],
+        "oncomplete": [
+          "/// Stream of `complete` events handled by this [Transaction]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Transaction]."
+        ]
+      }
+    }
+  },
+  "dart.dom.svg": {
+    "SVGElementInstance": {
+      "members": {
+        "abortEvent": [
+          "/**",
+          "   * Static factory designed to expose `abort` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "beforecopyEvent": [
+          "/**",
+          "   * Static factory designed to expose `beforecopy` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "beforecutEvent": [
+          "/**",
+          "   * Static factory designed to expose `beforecut` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "beforepasteEvent": [
+          "/**",
+          "   * Static factory designed to expose `beforepaste` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "blurEvent": [
+          "/**",
+          "   * Static factory designed to expose `blur` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "changeEvent": [
+          "/**",
+          "   * Static factory designed to expose `change` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "clickEvent": [
+          "/**",
+          "   * Static factory designed to expose `click` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "contextmenuEvent": [
+          "/**",
+          "   * Static factory designed to expose `contextmenu` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "copyEvent": [
+          "/**",
+          "   * Static factory designed to expose `copy` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "cutEvent": [
+          "/**",
+          "   * Static factory designed to expose `cut` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dblclickEvent": [
+          "/**",
+          "   * Static factory designed to expose `doubleclick` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dragendEvent": [
+          "/**",
+          "   * Static factory designed to expose `dragend` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dragenterEvent": [
+          "/**",
+          "   * Static factory designed to expose `dragenter` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dragEvent": [
+          "/**",
+          "   * Static factory designed to expose `drag` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dragleaveEvent": [
+          "/**",
+          "   * Static factory designed to expose `dragleave` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dragoverEvent": [
+          "/**",
+          "   * Static factory designed to expose `dragover` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dragstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `dragstart` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dropEvent": [
+          "/**",
+          "   * Static factory designed to expose `drop` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "focusEvent": [
+          "/**",
+          "   * Static factory designed to expose `focus` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "inputEvent": [
+          "/**",
+          "   * Static factory designed to expose `input` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "keydownEvent": [
+          "/**",
+          "   * Static factory designed to expose `keydown` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "keypressEvent": [
+          "/**",
+          "   * Static factory designed to expose `keypress` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "keyupEvent": [
+          "/**",
+          "   * Static factory designed to expose `keyup` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadEvent": [
+          "/**",
+          "   * Static factory designed to expose `load` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mousedownEvent": [
+          "/**",
+          "   * Static factory designed to expose `mousedown` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseenterEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseenter` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseleaveEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseleave` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mousemoveEvent": [
+          "/**",
+          "   * Static factory designed to expose `mousemove` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseoutEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseout` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseoverEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseover` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseupEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseup` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mousewheelEvent": [
+          "/**",
+          "   * Static factory designed to expose `mousewheel` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [ElementInstance]."
+        ],
+        "onbeforecopy": [
+          "/// Stream of `beforecopy` events handled by this [ElementInstance]."
+        ],
+        "onbeforecut": [
+          "/// Stream of `beforecut` events handled by this [ElementInstance]."
+        ],
+        "onbeforepaste": [
+          "/// Stream of `beforepaste` events handled by this [ElementInstance]."
+        ],
+        "onblur": [
+          "/// Stream of `blur` events handled by this [ElementInstance]."
+        ],
+        "onchange": [
+          "/// Stream of `change` events handled by this [ElementInstance]."
+        ],
+        "onclick": [
+          "/// Stream of `click` events handled by this [ElementInstance]."
+        ],
+        "oncontextmenu": [
+          "/// Stream of `contextmenu` events handled by this [ElementInstance]."
+        ],
+        "oncopy": [
+          "/// Stream of `copy` events handled by this [ElementInstance]."
+        ],
+        "oncut": [
+          "/// Stream of `cut` events handled by this [ElementInstance]."
+        ],
+        "ondblclick": [
+          "/// Stream of `doubleclick` events handled by this [ElementInstance]."
+        ],
+        "ondrag": [
+          "/// Stream of `drag` events handled by this [ElementInstance]."
+        ],
+        "ondragend": [
+          "/// Stream of `dragend` events handled by this [ElementInstance]."
+        ],
+        "ondragenter": [
+          "/// Stream of `dragenter` events handled by this [ElementInstance]."
+        ],
+        "ondragleave": [
+          "/// Stream of `dragleave` events handled by this [ElementInstance]."
+        ],
+        "ondragover": [
+          "/// Stream of `dragover` events handled by this [ElementInstance]."
+        ],
+        "ondragstart": [
+          "/// Stream of `dragstart` events handled by this [ElementInstance]."
+        ],
+        "ondrop": [
+          "/// Stream of `drop` events handled by this [ElementInstance]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [ElementInstance]."
+        ],
+        "onfocus": [
+          "/// Stream of `focus` events handled by this [ElementInstance]."
+        ],
+        "oninput": [
+          "/// Stream of `input` events handled by this [ElementInstance]."
+        ],
+        "onkeydown": [
+          "/// Stream of `keydown` events handled by this [ElementInstance]."
+        ],
+        "onkeypress": [
+          "/// Stream of `keypress` events handled by this [ElementInstance]."
+        ],
+        "onkeyup": [
+          "/// Stream of `keyup` events handled by this [ElementInstance]."
+        ],
+        "onload": [
+          "/// Stream of `load` events handled by this [ElementInstance]."
+        ],
+        "onmousedown": [
+          "/// Stream of `mousedown` events handled by this [ElementInstance]."
+        ],
+        "onmouseenter": [
+          "/// Stream of `mouseenter` events handled by this [ElementInstance]."
+        ],
+        "onmouseleave": [
+          "/// Stream of `mouseleave` events handled by this [ElementInstance]."
+        ],
+        "onmousemove": [
+          "/// Stream of `mousemove` events handled by this [ElementInstance]."
+        ],
+        "onmouseout": [
+          "/// Stream of `mouseout` events handled by this [ElementInstance]."
+        ],
+        "onmouseover": [
+          "/// Stream of `mouseover` events handled by this [ElementInstance]."
+        ],
+        "onmouseup": [
+          "/// Stream of `mouseup` events handled by this [ElementInstance]."
+        ],
+        "onmousewheel": [
+          "/// Stream of `mousewheel` events handled by this [ElementInstance]."
+        ],
+        "onpaste": [
+          "/// Stream of `paste` events handled by this [ElementInstance]."
+        ],
+        "onreset": [
+          "/// Stream of `reset` events handled by this [ElementInstance]."
+        ],
+        "onresize": [
+          "/// Stream of `resize` events handled by this [ElementInstance]."
+        ],
+        "onscroll": [
+          "/// Stream of `scroll` events handled by this [ElementInstance]."
+        ],
+        "onsearch": [
+          "/// Stream of `search` events handled by this [ElementInstance]."
+        ],
+        "onselect": [
+          "/// Stream of `select` events handled by this [ElementInstance]."
+        ],
+        "onselectstart": [
+          "/// Stream of `selectstart` events handled by this [ElementInstance]."
+        ],
+        "onsubmit": [
+          "/// Stream of `submit` events handled by this [ElementInstance]."
+        ],
+        "onunload": [
+          "/// Stream of `unload` events handled by this [ElementInstance]."
+        ],
+        "pasteEvent": [
+          "/**",
+          "   * Static factory designed to expose `paste` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "resetEvent": [
+          "/**",
+          "   * Static factory designed to expose `reset` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "resizeEvent": [
+          "/**",
+          "   * Static factory designed to expose `resize` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "scrollEvent": [
+          "/**",
+          "   * Static factory designed to expose `scroll` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "searchEvent": [
+          "/**",
+          "   * Static factory designed to expose `search` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "selectEvent": [
+          "/**",
+          "   * Static factory designed to expose `select` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "selectstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `selectstart` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "submitEvent": [
+          "/**",
+          "   * Static factory designed to expose `submit` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "unloadEvent": [
+          "/**",
+          "   * Static factory designed to expose `unload` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
     }
   },
   "dart.dom.web_audio": {
+    "AudioBufferSourceNode": {
+      "members": {
+        "endedEvent": [
+          "/**",
+          "   * Static factory designed to expose `ended` events to event",
+          "   * handlers that are not necessarily instances of [AudioBufferSourceNode].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onended": [
+          "/// Stream of `ended` events handled by this [AudioBufferSourceNode]."
+        ]
+      }
+    },
+    "AudioContext": {
+      "members": {
+        "completeEvent": [
+          "/**",
+          "   * Static factory designed to expose `complete` events to event",
+          "   * handlers that are not necessarily instances of [AudioContext].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "oncomplete": [
+          "/// Stream of `complete` events handled by this [AudioContext]."
+        ]
+      }
+    },
+    "OscillatorNode": {
+      "members": {
+        "endedEvent": [
+          "/**",
+          "   * Static factory designed to expose `ended` events to event",
+          "   * handlers that are not necessarily instances of [OscillatorNode].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onended": [
+          "/// Stream of `ended` events handled by this [OscillatorNode]."
+        ]
+      }
+    },
     "ScriptProcessorNode": {
       "members": {
+        "audioprocessEvent": [
+          "/**",
+          "   * Static factory designed to expose `audioprocess` events to event",
+          "   * handlers that are not necessarily instances of [ScriptProcessorNode].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
         "onaudioprocess": [
+          "/// Stream of `audioprocess` events handled by this [ScriptProcessorNode].",
           "/**",
           "   * Get a Stream that fires events when AudioProcessingEvents occur.",
           "   * This particular stream is special in that it only allows one listener to a",
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index e429275..852706f 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -333,8 +333,11 @@
     "support_level": "experimental"
   },
   "BeforeUnloadEvent": {
-    "members": {},
-    "support_level": "untriaged"
+    "comment": "http://www.w3.org/html/wg/drafts/html/master/browsers.html#beforeunloadevent",
+    "members": {
+      "returnValue": {}
+    },
+    "support_level": "stable"
   },
   "BiquadFilterNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#BiquadFilterNode-section",
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index 0db0fee..125dbc8 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -474,6 +474,8 @@
 # Syntax is: ClassName.(get\:|set\:|call\:|on\:)?MemberName
 # Using get: and set: is optional and should only be used when a getter needs
 # to be suppressed but not the setter, etc.
+# Prepending ClassName with = will only match against direct class, not for
+# subclasses.
 # TODO(jacobr): cleanup and augment this list.
 removed_html_members = monitored.Set('htmlrenamer.removed_html_members', [
     'AudioBufferSourceNode.looping', # TODO(vsm): Use deprecated IDL annotation
@@ -594,7 +596,7 @@
     'Element.webkitCreateShadowRoot',
     'Element.webkitPseudo',
     'Element.webkitShadowRoot',
-    'Event.returnValue',
+    '=Event.returnValue', # Only suppress on Event, allow for BeforeUnloadEvnt.
     'Event.srcElement',
     'EventSource.URL',
     'FontFaceSet.load',
@@ -845,16 +847,26 @@
       return True
 
   def _FindMatch(self, interface, member, member_prefix, candidates):
+    def find_match(interface_id):
+      member_name = interface_id + '.' + member
+      if member_name in candidates:
+        return member_name
+      member_name = interface_id + '.' + member_prefix + member
+      if member_name in candidates:
+        return member_name
+      member_name = interface_id + '.*'
+      if member_name in candidates:
+        return member_name
+
+    # Check direct matches first
+    match = find_match('=%s' % interface.id)
+    if match:
+      return match
+
     for interface in self._database.Hierarchy(interface):
-      member_name = interface.id + '.' + member
-      if member_name in candidates:
-        return member_name
-      member_name = interface.id + '.' + member_prefix + member
-      if member_name in candidates:
-        return member_name
-      member_name = interface.id + '.*'
-      if member_name in candidates:
-        return member_name
+      match = find_match(interface.id)
+      if match:
+        return match
 
   def GetLibraryName(self, interface):
     # Some types have attributes merged in from many other interfaces.
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 21deb41..833fb23 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -98,6 +98,7 @@
 _js_custom_constructors = monitored.Set('systemhtml._js_custom_constructors', [
     'AudioContext',
     'Blob',
+    'Comment',
     'MutationObserver',
     'RTCIceCandidate',
     'RTCPeerConnection',
diff --git a/tools/dom/templates/html/dartium/html_dartium.darttemplate b/tools/dom/templates/html/dartium/html_dartium.darttemplate
index daaf6ba..0ee99a3 100644
--- a/tools/dom/templates/html/dartium/html_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/html_dartium.darttemplate
@@ -54,6 +54,8 @@
 
 $!GENERATED_DART_FILES
 
+// Issue 14721, order important for WrappedEvent.
+part '$AUXILIARY_DIR/WrappedEvent.dart';
 part '$AUXILIARY_DIR/AttributeMap.dart';
 part '$AUXILIARY_DIR/CanvasImageSource.dart';
 part '$AUXILIARY_DIR/CrossFrameTypes.dart';
@@ -73,7 +75,6 @@
 part '$AUXILIARY_DIR/ReadyState.dart';
 part '$AUXILIARY_DIR/Serialization.dart';
 part '$AUXILIARY_DIR/Validators.dart';
-part '$AUXILIARY_DIR/WrappedEvent.dart';
 part '$AUXILIARY_DIR/WrappedList.dart';
 part '$AUXILIARY_DIR/_HttpRequestUtils.dart';
 part '$AUXILIARY_DIR/_ListIterators.dart';
diff --git a/tools/dom/templates/html/impl/impl_Comment.darttemplate b/tools/dom/templates/html/impl/impl_Comment.darttemplate
new file mode 100644
index 0000000..df0d378
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_Comment.darttemplate
@@ -0,0 +1,17 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of $LIBRARYNAME;
+
+@DocsEditable()
+$(ANNOTATIONS)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$MIXINS$IMPLEMENTS$NATIVESPEC {
+$if DART2JS
+  factory Comment([String data]) {
+    if (data != null) {
+      return JS('Comment', '#.createComment(#)', document, data);
+    }
+    return JS('Comment', '#.createComment("")', document);
+  }
+$endif
+$!MEMBERS}
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index e04ec31..5c52b06 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -783,8 +783,17 @@
   @DocsEditable()
   String get localName => _localName;
 
+  /**
+   * A URI that identifies the XML namespace of this element.
+   *
+   * `null` if no namespace URI is specified.
+   *
+   * ## Other resources
+   *
+   * * [Node.namespaceURI]
+   * (http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-NodeNSname) from W3C.
+   */
   @DomName('Element.namespaceUri')
-  @DocsEditable()
   String get namespaceUri => _namespaceUri;
 
   String toString() => localName;
@@ -828,6 +837,12 @@
   }
 
 $if DART2JS
+  /**
+   * Static factory designed to expose `mousewheel` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseWheelEvent')
   static const EventStreamProvider<WheelEvent> mouseWheelEvent =
       const _CustomEventStreamProvider<WheelEvent>(
@@ -846,6 +861,12 @@
     }
   }
 
+  /**
+   * Static factory designed to expose `transitionend` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.transitionEndEvent')
   static const EventStreamProvider<TransitionEvent> transitionEndEvent =
       const _CustomEventStreamProvider<TransitionEvent>(
@@ -990,6 +1011,17 @@
   }
 
 $if DART2JS
+  /**
+   * Creates a new shadow root for this shadow host.
+   *
+   * ## Other resources
+   *
+   * * [Shadow DOM 101]
+   * (http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom/)
+   * from HTML5Rocks.
+   * * [Shadow DOM specification]
+   * (http://www.w3.org/TR/shadow-dom/) from W3C.
+   */
   @DomName('Element.createShadowRoot')
   @SupportedBrowser(SupportedBrowser.CHROME, '25')
   @Experimental()
@@ -999,6 +1031,17 @@
       this, this, this);
   }
 
+  /**
+   * The shadow root of this shadow host.
+   *
+   * ## Other resources
+   *
+   * * [Shadow DOM 101]
+   * (http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom/)
+   * from HTML5Rocks.
+   * * [Shadow DOM specification]
+   * (http://www.w3.org/TR/shadow-dom/) from W3C.
+   */
   @DomName('Element.shadowRoot')
   @SupportedBrowser(SupportedBrowser.CHROME, '25')
   @Experimental()
diff --git a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
index 2ff16e3..53adce9 100644
--- a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
@@ -238,6 +238,12 @@
   }
 $endif
 
+  /**
+   * Static factory designed to expose `visibilitychange` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.visibilityChange')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
diff --git a/tools/dom/templates/html/impl/impl_Window.darttemplate b/tools/dom/templates/html/impl/impl_Window.darttemplate
index a45122a..a0211c8 100644
--- a/tools/dom/templates/html/impl/impl_Window.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Window.darttemplate
@@ -271,13 +271,18 @@
   static bool get supportsPointConversions => _DomPoint.supported;
 $!MEMBERS
 
+  /**
+   * Static factory designed to expose `beforeunload` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.beforeunloadEvent')
-  @DocsEditable()
   static const EventStreamProvider<BeforeUnloadEvent> beforeUnloadEvent =
       const _BeforeUnloadEventStreamProvider('beforeunload');
 
+  /// Stream of `beforeunload` events handled by this [Window].
   @DomName('Window.onbeforeunload')
-  @DocsEditable()
   Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
 
   void moveTo(Point p) {
@@ -292,6 +297,7 @@
 $endif
 }
 
+$if DART2JS
 class _BeforeUnloadEvent extends _WrappedEvent implements BeforeUnloadEvent {
   String _returnValue;
 
@@ -301,15 +307,14 @@
 
   void set returnValue(String value) {
     _returnValue = value;
-$if DART2JS
     // FF and IE use the value as the return value, Chrome will return this from
     // the event callback function.
     if (JS('bool', '("returnValue" in #)', wrapped)) {
       JS('void', '#.returnValue = #', wrapped, value);
     }
-$endif
   }
 }
+$endif
 
 class _BeforeUnloadEventStreamProvider implements
     EventStreamProvider<BeforeUnloadEvent> {
@@ -318,8 +323,10 @@
   const _BeforeUnloadEventStreamProvider(this._eventType);
 
   Stream<BeforeUnloadEvent> forTarget(EventTarget e, {bool useCapture: false}) {
-    var controller = new StreamController(sync: true);
     var stream = new _EventStream(e, _eventType, useCapture);
+$if DART2JS
+    var controller = new StreamController(sync: true);
+
     stream.listen((event) {
       var wrapped = new _BeforeUnloadEvent(event);
       controller.add(wrapped);
@@ -327,6 +334,9 @@
     });
 
     return controller.stream;
+$else
+    return stream;
+$endif
   }
 
   String getEventType(EventTarget target) {
